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);
为例进行细述(仅仅叙述常规路径)
- 根据serviceType找到组件元数据,然后定位到生命周期管理器
- 从生命周期管理器获取组件进行返回。
组件生命周期怎样获取组件并返回的,这需要看具体的组件生命周期管理器了:
- 单利管理器,首先判断容器内是否有已经创建好的组件,如果有直接返回,没有则委托组件工厂进行创建,然后存储并返回
- 临时管理器,每次都委派组件工厂进行创建然后直接返回创建好的组件
- 线程管理器,首先从线程局部存储容器中获取已经创建好的组件,如果有直接返回,没有则委托组件工厂进行创建,然后存储到TLS中并返回
- 泛型单利/l临时/线程管理器,和前三种类似,不过是基于泛型的创建而已,在这里先不做陈述。
组件生命周期管理器仅仅是一个组件生命容器,不做具体的创建工作的,而具体的创建工作是由组件工厂完成的。组件工厂有分很多种,不同的组件工厂其创建策略都不同。
- 实例工厂,直接返回组件实例(因为组件实例是在注册组件是提供的)
- 委派工厂,通过委托函数(组件在注册时自己提供了基于委托函数的工厂)创建并返回
- 缺省工厂,通过一定的算法进行选择合适的构造函数进行创建并返回,具体算法请参见:Mini容器学习笔记7-构造函数注入
- 动态代理工厂,比较复杂,以后将单独开篇进行细述。
到这里为止介绍了DI容器最基本功能,组件注册和组件创建和组件获取,但是缺少了依赖注入功能,依赖注入功能将在下篇进行详细介绍,这里附上我花了很大功夫才画好的Mini容器脑图:
关于Mini容器的其它相关文章介绍: