【转】ABP源码分析六:依赖注入的实现

ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架。2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入的约定(规则),然后通过IocManager来读取这个规则完成依赖注入。3另一种实现途径是直接IocManager的Register方法直接完成注入。

 

第一种途径

下面具体分析:代码在Abp项目文件的Dependency文件夹下。

先出一张相关接口和类的关系图,然后逐个解释。

IDictionaryBasedConfig/DictionaryBasedConfig: 提供通过Dictionary来管理configuration的功能。经分析,这个Dictionary自始至终都没被用到过,不清楚Abp作者是怎么想的。

ConventionalRegistrationConfig:封装了一个bool属性InstallInstallers,用以告诉Abp底层框架是否要register相应assembly中的通过IWindsorInstaller接口指定的register规则。(具体参考Castle关于通过IWindsorInstaller进行register的知识)

IConventionalRegistrationContext/ConventionalRegistrationContext: 和其他上下文类起的作用类似。主要就是作为方法参数方便方法间的传递数据。这里主要封装了Assembly,IocManager和ConventionalRegistrationConfig。

IConventionalDependencyRegistrar:IocManager封装了一个IConventionalDependencyRegistrar的list. IocManager在RegisterAssemblyByConvention方法中遍历这个list,并根据IConventionalDependencyRegistrar的实例中定义的规则来完成register。注:IocManager的RegisterAssemblyByConvention是在AbpKernelModule的Initialize方法中被调用的。

下面按顺序贴一下代码:

首先AbpKernelModule在PreInitialize方法中给IocManager的IConventionalDependencyRegistrar的list中加入BasicConventionalRegistrar(后面有解释)

IocManager维护了一个叫_conventionalRegistrars的list,其中的元素类型就是IConventionalDependencyRegistrar。

接着IocManager的RegisterAssemblyByConvention是在AbpKernelModule的Initialize方法中被调用

IocManager在RegisterAssemblyByConvention方法中遍历这个list,并根据IConventionalDependencyRegistrar的实例中定义的规则来完成register。

IConventionalDependencyRegistrar的四个实现类在前面文章有讲过,这边不在重复了。贴下BasicConventionalRegistrar的代码,其注册所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类。

到这里,基本讲清楚了通过IConventionalDependencyRegistrar进行依赖注入的过程。

 

第二种途径

直接上代码解释,AbpModule有个受保护的IocManager的成员,所以AbpModule的派生类都可以使用这个IocManager完成注册。

 

最后推荐Abp中一个比较有意思的单例模式的实现:

SingletonDependency: 为容器中的实例生成Singelton实例的方法(不做解释)。这是一个线程安全并且实现了延时加载的单例模式。充分利用了.Net 4.0的新语法Lazy.

 

返回ABP源码分析系列文章目录

 

Q:有几点问题想请教,
初始化只是在Castle里注册了各个模块,
但实例是在运行时才注入的,并且ABP可以逐层注入所需的依赖,这一点是Castle的IOC自带的特性还是ABP的实现?
另外注入的起点是从哪里开始呢?Controler吗?
A:ABP是靠Castle实现依赖注入的,ABP本身是没有实现依赖注入的功能的。注入的起点是指什么?ABP各个模块都是在PreInitialize或Initialize方法中配置注入

E:我刚才找到答案了,我的意思是指在bootstraper中,完成了初始化注册后
调用了
 

1

_moduleManager = IocManager.Resolve<IAbpModuleManager>();



那么AbpModuleManager中所有的依赖(无论是通过构造器注入或者属性注入)都会被注入,比如其中的IIocManager和IModuleFinder都被注入,然后调用各个模块注册控件。

那么起点就是第一个调用Resolve地方,我就是在找这个。
因为每一层都是Castle自动注入的,但总要有一个开端来Resolve吧,刚才就是在好奇这个。

不过Castle也太强大了,同时支持属性注入和构造器注入,并且逐层注入,其他的IOC框架似乎都没有这么智能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值