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源码分析系列文章目录

最新文章

  1. select 相关
  2. 推荐一篇好文:OSG OSGearth vs2010编译
  3. 6.3.28微信需群主确认才可进群&发GIF动图功能内测开始了
  4. Linux 中文乱码问题解决
  5. 在LaTeX文档中插入图片的几种常用的方法
  6. Twitter 登录和分享
  7. Java IO之File
  8. ha_innobase::rnd_next
  9. ASP.NET常用技术之Cookie
  10. nginx1.9.4 +php 5.5.29+yii2.0配置手册
  11. 论文笔记(4):Fully Convolutional Networks for Semantic Segmentation
  12. OpenCL中的half与float的转换
  13. python学习日记(OOP——类的内置方法)
  14. cf1110d 线性dp
  15. Docker容器中找不到vim命令
  16. m_Orchestrate learning system---三十一、模板和需求的关系
  17. 删除k8s中一直处于Terminating的资源
  18. ASP.NET SignalR-B.S/C.S 相互打通DEMO
  19. [svc][op]ssh交互yes问题解决-expect
  20. Objective C - 3 - 实现一个计算器

热门文章

  1. Web性能优化:What? Why? How?
  2. SQL数据库之DQL
  3. OpenCASCADE Expression Interpreter by Flex & Bison
  4. JS与APP原生控件交互
  5. 关于python的bottle框架跨域请求报错问题的处理
  6. 记录我这一年的技术之路(nodejs纯干货)
  7. DDD 领域驱动设计-两个实体的碰撞火花
  8. js闭包 和 prototype
  9. [数据结构]——链表(list)、队列(queue)和栈(stack)
  10. 【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引