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容器脑图:

关于Mini容器的其它相关文章介绍:

Mini 容器介绍

Mini 容器学习目录

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

posted @ 2011-04-21 17:45  风云  阅读(1979)  评论(7编辑  收藏  举报