DI容器核心功能包含2大件,服务注册表和服务定位器。
服务注册表:掌管服务的配置或注册,服务注册成功后,DI容器会生成组件的元数据信息包含:
- 组件Id标志(服务定位器根据该标志获取组件实例),如果组件在注册时未提供标志,那么系统根据组件类型动态生成一个标志
- 组件类型
- 契约接口集合,一个组件可以实现多个契约接口,契约接口必须贴上ContractAttribute方可有效,这和WCF的服务契约一样
- 组件工厂,用来创建组件的 ,分为:1):缺省工厂(Emit反射创建对象),2):Instance工厂(如果注册了一个组件对象那么就用实例工厂),3):委派工厂(如注册代理对象等),4:)动态代理工厂(供Aop使用)
- 生命周期管理器(管理组件生命周期的,是组件的容器),分为:单利,临时,线程内单利,泛型单利,泛型临时,泛型线程内单利
- 扩展属性,用来扩展元数据的,常常供监听器使用。
DI的查找接口有很多:具体请参看:http://nlite.codeplex.com/SourceControl/changeset/view/76470#1519585,在这里以一个最简单的接口方法:
object Get(Type serviceType);
为例进行细述(仅仅叙述常规路径)
- 根据serviceType找到组件元数据,然后定位到生命周期管理器
- 从生命周期管理器获取组件进行返回。
- 单利管理器,首先判断容器内是否有已经创建好的组件,如果有直接返回,没有则委托组件工厂进行创建,然后存储并返回
- 临时管理器,每次都委派组件工厂进行创建然后直接返回创建好的组件
- 线程管理器,首先从线程局部存储容器中获取已经创建好的组件,如果有直接返回,没有则委托组件工厂进行创建,然后存储到TLS中并返回
- 泛型单利/l临时/线程管理器,和前三种类似,不过是基于泛型的创建而已,在这里先不做陈述。
- 实例工厂,直接返回组件实例(因为组件实例是在注册组件是提供的)
- 委派工厂,通过委托函数(组件在注册时自己提供了基于委托函数的工厂)创建并返回
- 缺省工厂,通过一定的算法进行选择合适的构造函数进行创建并返回,具体算法请参见:Mini容器学习笔记7-构造函数注入
- 动态代理工厂,比较复杂,以后将单独开篇进行细述。
关于Mini容器的其它相关文章介绍:
Mini 容器介绍
最新评论