欢迎光临
我们一直在努力

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

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

 

第一种途径

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

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

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

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(后面有解释)

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

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

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

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

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

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

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

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

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

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

 

第二种途径

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

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

 

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

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

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

 

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

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《ABP源码分析六:依赖注入的实现》
文章链接:https://www.456zj.com/20527.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址