ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ABP之依赖注入源码解析

2022-08-19 15:04:14  阅读:214  来源: 互联网

标签:PersonAppService 接口 ABP 源码 IPersonAppService 注册 解析 注入


ABP的依赖注入基于Castle Windsor,可以通过Nuget搜索Castle.Windsor来安装使用

 

 

 

 

ABP框架运行其实是以模块进行加载的运行的,通过源码得知AbpModule是所有模块基类,本质上是一个抽象类,有三个虚方法,分别为:PreInitialize、Initialize、PostInitialize.

 

子类在继承的时候,必须重写它,在PreInitialize方法里就可以通过Castle Windsor依赖注入接口对象:

 

 

 图中,可以看到,通过IcoManager.AddConventionalRegister方法按照约定注册了mvc的控制器,这些都是ABP在启动的时候,自行注入。

ABP中的依赖注入

1、注册(Registering

在ABP中,有很多种方式来注册你的类到到系统里,通常常规方法就可以满足我们大部分日常场景。

2、常规注册(conventional registration

在ABP中大量运用到【常规注册】,按照约定ABP在启动的时候会自动注入IRepository、IDomainService、IApplicationService、ILogger、MVC控制器、webapi控制器。

比如:mvc控制器。

从图中可以看到,通过IcoManager.AddConventionalRegister方法,传入了ControllerConventionalRegistrar实例,F12进入其中,可看到

 

 

 

当然比较有意思的是下图中的红线框框处的代码:

 

 

解释下:这是以WindsorControllerFactory取代了asp.net mvc默认的控制器工厂,并且注入我们的IOC容器实例,这样我们即可在控制器的构造函数中通过依赖注入,获取接口对象实例。

 

ABP的依赖注入几个核心接口

 IApplicationService

比如,你可能有一个IPersonAppService接口和一个实现了该接口的PersonAppService类:

public interface IPersonAppService : IApplicationService
{
    //...
}

public class PersonAppService : IPersonAppService
{
    //...
}

因为它实现了IApplicationService接口(只是一个空接口),所以ABP会自动注册它,并注册为transient(每次使用创建一个实例)。当你使用构造函数注入IPersonAppService接口到一个类中时,一个PersonAppService对象会自动地创建并传入该类的构造函数中。

命名规范在ABP中非常重要。比如,你可以将PersonAppService更名为MyPersonAppService或是其他包含了“PersonAppService”后缀的名字,因为IPersonAppService接口有这个后缀。但你不能将它命名为PeopleService。如果你没有按照这种命名规范来操作的话,那么IPersonAppService不会自动地注册(但是它已经以自注册的方式注入到DI框架,而不是接口方式),因此如果你想要以接口方式注册的话,那么你应该手动注册。

IDomainService

ABP定义了IDomainService接口,所有的领域服务都按照惯例实现了该接口。当实现时,领域服务会以transient自动注册到依赖注入系统。

此外,领域服务(可选地)可以从DomainService类继承。因此,它可以使用一些继承的属性,比如logging,本地化等等。当然,如果没有继承,如果需要的话也可以注入这些属性。

 

标签:PersonAppService,接口,ABP,源码,IPersonAppService,注册,解析,注入
来源: https://www.cnblogs.com/ybyyds/p/16600958.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有