论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
ABP之依赖注入源码解析
ABP之依赖注入源码解析
守听
金牌会员
|
2022-9-16 17:19:21
|
显示全部楼层
|
阅读模式
楼主
主题
882
|
帖子
882
|
积分
2646
ABP的依赖注入基于Castle Windsor,可以通过Nuget搜索Castle.Windsor来安装使用
ABP框架运行其实是以模块进行加载的运行的,通过源码得知AbpModule是所有模块基类(也就是说一个程序集就是一个模块,我们在创建类库时,可以在创建一个模块类的时候继承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容器实例,这样我们即可在控制器的构造函数中通过依赖注入,获取接口对象实例。
那问题来了,这些常规注册的对象,是如何在应用在启动的时候就注入到了ioc容器了呢?答案看下图:
AbpWebApplication类相当与Global.asax文件(asp.net的开发不陌生吧)
我们再细看AbpBootstrapper的Initialize方法:
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,本地化等等。当然,如果没有继承,如果需要的话也可以注入这些属性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
守听
金牌会员
这个人很懒什么都没写!
楼主热帖
【网络编程】从零开始搭建一个开源博客 ...
Vulnhub靶机-Al-Web-1
报错building for iOS Simulator, but ...
Python学习:import的正确用法
【CSDN云VS腾讯云】要不然怎么说CSDN开 ...
面试官:BIO、NIO、AIO是什么,他们有 ...
TCP协议
如何成为一名开发人员——第 3 部分: ...
UWP/WinUI3 Win2D PixelShaderEffec ...
全网最新的nacos 2.1.0集群多节点部署 ...
标签云
存储
服务器
快速回复
返回顶部
返回列表