天天最资讯丨ABP - 依赖注入(1)
Abp依赖注入的配置方式手动注册依赖注入关系依赖注入实现了系统之间、模块之间和对象之间依赖关系的解耦,基本上是现代应用程序框架必不可少的一个组成部分。
ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection),所以能够完全兼容.net Core中的依赖注入的用法,同时使用 Autofac 替换了.net Core中的内部容器,利用了Autofac中的一些特性。
【资料图】
与Asp.Net Core在Startup
类中的ConfigureServices()
方法中,通过IServiceCollection
向容器中添加依赖注入关系没有区别,在Abp框架中也完成兼容这种方式。
不过这些依赖关系的配置一般会在各自的模块中配置,而不是全部都写在Startup类中,这样使得各个模块之间更加独立,开箱即用。
[DependsOn(typeof(AbpAspNetCoreModule))][DependsOn(typeof(SuncereAbpDataModule))]public class SuncereAbpFreeSqlModule : AbpModule{ public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddFreeSql(); }}
示例中的代码是我们项目中一个ORM模块的依赖注入配置,这是模块基于FreeSql这个ORM框架进行了一层分组,兼容了Abp的工作单元、默认仓储模式。上一篇文章中讲在Abp框架初始化时,会将容器对象在各个模块类中进行传递,context.Services
就是传递过来的IServiceCollection
。
除了手动注册的方式之外,Abp框架依赖注入体系的很方便的一个点,就是提供了按照约定的自动依赖注入关系注册。最基本的,在只使用了Volo.Abp核心库的情况下,会将实现了特定接口的类进行注册,根据依赖注入的生命周期,Abp提供了三个接口。
• ITransientDependency 注册为transient生命周期.• ISingletonDependency 注册为singleton生命周期.• IScopedDependency 注册为scoped生命周期.
这些接口,都是空接口,起到标记的作用。这种设计方式,在微软的代码和很多框架中都很常见。
通过对源码的研究,可以发现这其实是Abp提供了一个约定注册器接口IConventionalRegistrar,并且Abp提供了实现默认的实现。并且在Abp引擎初始化的时候,将所有的模块程序集遍历了一遍,将其中满足约定的类进行了依赖注入注册。
查看自动依赖注入源码的入口点,其实就在上篇文章中提到的Abp引擎初始化过程中,AbpApplicationBase
构造函数中调用的AddCoreAbpServices()
方法中,其中的services.AddAssemblyOf
是关键。
可以看到,这里向集合中添加了默认预定注册器,并且通过规则进行依赖注入注册。那么规则注册器是如何查找程序集中的类,并且注册依赖关系的呢?
这里就看到了上面提到的三个接口了,但是从这里可以看出,这三个接口只是提供了生命周期的信息,但是依赖注入的注册,除了生命周期,还有类与接口的对应关系。
通过对DefaultConventionalRegistrar
、ConventionalRegistrarBase
、ExposedServiceExplorer
、ExposeServicesAttribute
代码的查看,可以明白Abp默认的依赖关系注册是怎么样的,以及它是怎么实现的。
默认规则注册:1)实现了ITransientDependency等三个接口的公开、非泛型类,会被注册到容器中。2)如果这个类实现了其他接口,并且这个接口和类之间的命名符合规则,接口和类的关系会被注册到容器中。
例如
public class BookRepository: IRepository, IBookRepository, IBookStore, ITransientDependency{}
上面的代码中,BookRepository
在容器中是可以找到三个依赖关系配置的。
除了默认规则注册之外,Abp还在其他模块中提供了其他的注册规则,如Volo.Abp.AspNetCore.Mvc模块中的AbpAspNetCoreMvcConventionalRegistrar
、Volo.Abp.AspNetCore.Components
中的AbpWebAssemblyConventionalRegistrar
等。
Abp框架固有的注册类型一些特定类型会默认注册到依赖注入.例子:• 模块类注册为singleton.• MVC控制器(继承Controller或AbpController)被注册为transient.• MVC页面模型(继承PageModel或AbpPageModel)被注册为transient.• MVC视图组件(继承ViewComponent或AbpViewComponent)被注册为transient.• 应用程序服务(实现IApplicationService接口或继承ApplicationService类)注册为transient.• 存储库(实现IRepository接口)注册为transient.• 域服务(实现IDomainService接口)注册为transient.
我们也可以通过实现自己的依赖注入注册规则,只需要实现IConventionalRegistrar
接口,并在模块类中的PreConfigureServices()
方法中将其添加到ConventionalRegistrarList
中。
从上面的源码中也可以看出,Abp框架也支持通过特性的方式声明依赖注入关系的,而且特性的声明方式会优先于默认约定的方式。
我们可以用 DependencyAttribute
声明依赖注入的生命周期和注入的方式,ExposeServicesAttribute
声明类和接口之间的对应关系。ExposeServicesAttribute
就是 IExposedServiceTypesProvider
的实现类。
特别注意的,在声明了ExposeServicesAttribute
,并且未设置IncludeDefaults
、IncludeSelf
的值的情况下,由于默认值的关系,这两个值会是false,即默认约定不起作用了,该类注册为ExposeServicesAttribute
中指定的接口的实现。 当然ExposeServicesAttribute
可以指定多个接口。
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)][ExposeServices(typeof(IBookRepository))]public class BookRepository: IRepository, IBookRepository, IBookStore{}
泛型类的注册通过源码可以知道,无论是按照约定自动注册,还是通过特性的方式进行注册,都是无法注册泛型类的依赖注入关系的,泛型类的依赖注入关系只能够通过手动注册的方式注入。
context.service.AddTransient, Repository<,>>();
通过以上方式可以注册泛型类的依赖注入关系,<> 中一个,表示该类有两个泛型类型。
以上是依赖注入配置部分的内容,这里拆成了两篇,避免文章太长大家阅读不适
ABP 系列总结:
目录:ABP 系列总结上一篇:ABP - 模块加载机制
关键词:
上一篇:日本上市企业1~3月净利润同比增长43%,时隔2年实现增长
下一篇:最后一页
- 广州科技活动周进入预热 明日正式启动300多场主题活动接踵而来
- 深化重点领域信用建设 广州正式出台新型监管机制实施方案
- 女童不慎掉入20米深井 18岁小姨三次下井成功营救
- 西安3个区域12月28日起每日开展全员核酸 官方提倡民众居家健身
- 浙江乐清一核酸检测结果异常人员 复采复检为阴性
- 浙江本轮疫情报告确诊病例490例 提倡“双节”非必要不出省
- 西安警方通报6起涉疫违法案件
- 西安新一轮核酸筛查日检测能力达160万管
- 西安市累计报告本土确诊病例811例
- 重庆曝光4起违反中央八项规定精神典型问题 警示党员干部清新过节
-
学佛之人,一定要认认真真阅读此文!
点击关注|人间佛法,打坐共修互联网宗教信息服务许可证编号:湘(2022)0000106一、人生的含义(人来到这世上
-
多国人士齐聚日本广岛 抗议七国集团峰会 世界新视野
连日来,日本多个团体联合多国人士发起游行集会,抗议19日至21日在日本广岛举行的七国集团峰会。20日,来自
-
世界看热讯:桃城区人社局多措并举推动社保扩面提质
5月19日,从衡水市桃城区人社局获悉,今年以来,桃城区积极开展参保扩面提质行动,加快实现基本养老保险、
-
世界滚动:回龙圩管理区召开2023年柑橘技术培训会
湖南日报·新湖南客户端5月21日讯(通讯员李卓成)5月20日,永州市回龙圩管理区召开2023年柑橘技术培训会,
-
天天热讯:宁波市计算机信息安全协会
1、宁波市计算机信息网络安全协会(以下简称协会)。2、英文译名为NingBoAssociationofComp
-
宁波市聚丰镀业有限公司|焦点
1、宁波市聚丰镀业有限公司于2014年06月05日成立。2、法定代表人金永平,公司经营范围包括:电镀加工;电池
-
毛鸡蛋吃多长时间最好?-当前通讯
毛蛋大约煮半个小时就可以煮熟了,首先将毛蛋清洗干净,然后在锅里加入清水和毛蛋煮半个小时,这样毛蛋就可
-
每日短讯:防护等级ip65和ip66_什么是防护等级IP65 IP55
1、第一种学说:看GB1498-79,电机、低压电器外壳防护等级什么是IP(防护等级)?IP(Internation
-
两肺纹理增多紊乱是什么意思啊_两肺纹理增多是什么意思 环球滚动
1、肺纹理增多是一个医学术语。2、肺纹理由肺的静脉和动脉组成,肺门形成的阴影像分支,故称肺纹理。3、正
-
预测2023年天津高考专科分数线 最低多少分可以上专科_天天热点
预测2023年天津综合类专科批分数线为120分左右。根据天津历年高考专科分数线来看,每年文物理类分数线变化
X 关闭
天天最资讯丨ABP - 依赖注入(1)
日本上市企业1~3月净利润同比增长43%,时隔2年实现增长
今日看点:四川珙县发生4.5级地震 当地启动地震四级应急响应 暂无人员伤亡
新策略下,农村将“停止”自建房,改造也禁止?如今答案已清晰了
X 关闭
得知西安疫情防控“升级” 男子夜骑共享单车回咸阳淳化
中国医生将任SIU主席背后:从追随者同行者到引领者
海南省通报政法队伍教育整顿成果
云南两地发现核酸阳性人员 西安实行最严格的社会面管控
广东梅州大埔中央红色交通线沿线发现多株百岁古树