di容器,DI 容器-Mini容器工作机制剖析

DI容器在DotNet 中已经不是什么稀罕东西了,如Castle,Unity,Ninject,StructureMap,Spring,MEF等等,这些DI容器都是老外设计的,国内开发的DI容器是少之又少,Mini容器便是少之又少中的一员。关于Mini容器的介绍,请参考去年7月份写的这篇文章:Mini容器介绍。
DI容器核心功能包含2大件,服务注册表服务定位器
服务注册表:掌管服务的配置或注册,服务注册成功后,DI容器会生成组件的元数据信息包含:
  • 组件Id标志(服务定位器根据该标志获取组件实例),如果组件在注册时未提供标志,那么系统根据组件类型动态生成一个标志
  • 组件类型
  • 契约接口集合,一个组件可以实现多个契约接口,契约接口必须贴上ContractAttribute方可有效,这和WCF的服务契约一样
  • 组件工厂,用来创建组件的 ,分为:1):缺省工厂(Emit反射创建对象),2):Instance工厂(如果注册了一个组件对象那么就用实例工厂),3):委派工厂(如注册代理对象等),4:)动态代理工厂(供Aop使用)
  • 生命周期管理器(管理组件生命周期的,是组件的容器),分为:单利,临时,线程内单利,泛型单利,泛型临时,泛型线程内单利
  • 扩展属性,用来扩展元数据的,常常供监听器使用。
服务定位器:用来查找组件的。这个查找功能是DI容器中最核心也是最复杂的。下面将详细描述一下细节,关于嵌套容器暂不陈述。
DI的查找接口有很多:具体请参看:http://nlite.codeplex.com/SourceControl/changeset/view/76470#1519585,在这里以一个最简单的接口方法:
object Get(Type serviceType);
为例进行细述(仅仅叙述常规路径)
  1. 根据serviceType找到组件元数据,然后定位到生命周期管理器
  2. 从生命周期管理器获取组件进行返回。
组件生命周期怎样获取组件并返回的,这需要看具体的组件生命周期管理器了:
  • 单利管理器,首先判断容器内是否有已经创建好的组件,如果有直接返回,没有则委托组件工厂进行创建,然后存储并返回
  • 临时管理器,每次都委派组件工厂进行创建然后直接返回创建好的组件
  • 线程管理器,首先从线程局部存储容器中获取已经创建好的组件,如果有直接返回,没有则委托组件工厂进行创建,然后存储到TLS中并返回
  • 泛型单利/l临时/线程管理器,和前三种类似,不过是基于泛型的创建而已,在这里先不做陈述。
组件生命周期管理器仅仅是一个组件生命容器,不做具体的创建工作的,而具体的创建工作是由组件工厂完成的。组件工厂有分很多种,不同的组件工厂其创建策略都不同。
  • 实例工厂,直接返回组件实例(因为组件实例是在注册组件是提供的)
  • 委派工厂,通过委托函数(组件在注册时自己提供了基于委托函数的工厂)创建并返回
  • 缺省工厂,通过一定的算法进行选择合适的构造函数进行创建并返回,具体算法请参见:Mini容器学习笔记7-构造函数注入
  • 动态代理工厂,比较复杂,以后将单独开篇进行细述。
到这里为止介绍了DI容器最基本功能,组件注册和组件创建和组件获取,但是缺少了依赖注入功能,依赖注入功能将在下篇进行详细介绍,这里附上我花了很大功夫才画好的Mini容器脑图:
di容器,DI 容器-Mini容器工作机制剖析
关于Mini容器的其它相关文章介绍:
Mini 容器介绍

Mini 容器学习目录

Mini 容器学习笔记1——环境搭建(基础篇)

Mini 容器学习笔记2——组件元数据(基础篇)

Mini 容器学习笔记3——组件的注册(基础篇)

Mini 容器学习笔记4——组件的生命周期(应用篇)

Mini 容器学习笔记5——组件的获取

Mini 容器学习笔记6——组件的获取(应用)

Mini 容器学习笔记7——构造函数注入

Mini 容器学习笔记8——字段注入

Mini 容器学习笔记9——属性注入

Mini 容器学习笔记10——方法注入

Mini 容器学习笔记11——Lazy注入

Mini 容器学习笔记12——组合实例

Mini 容器学习笔记13——插件注入


Tags:  dimini 奔奔mini 宝马mini n97mini di容器

延伸阅读

最新评论

发表评论