ObjectBuilder是一个可扩展的Application Block,同时也是Unity的基础。对于ObjectBuilder到底是什么有很多不同的理解,最普遍的描述是:ObjectBuilder是“依 赖注入的工具”,还有一种说法是“构建依赖注入容器的框架”,这些多少都有些出入。应该说ObjectBuilder是一个可配置的对象工厂。

  ObjectBuilder有两个版本,习惯称之为OB1和OB2。OB1在ObjectBuilder的网站上就可以down,OB2可以说 目前只流传于民间:)为什么这么说?因为目前只能从Unity的CTP版本中或者sample中得到,估计是会跟随Unity的Release一块儿发 布。

  对于OB1,黄忠成先生的Object Builder Application Block系列写得清晰透彻,当然,经过吕震宇先生的简体翻译:[转]Object Builder Application Block,可读性更上一层楼了。

  OB2在OB1的基础上可以说有了很大的改动,这里可以参考Chris的最新的一些blog,顺带说一句,这些blog读起来就要费些脑筋了,如果你不是真的想对ObjectBuilder弄个门清的话,那其实理解一下黄忠成先生文章中提到的一些概念和思想就足够了。

    Unity是什么?

  Unity是patterns & practices团队开发的一个轻量级、可扩展的依赖注入容器,具有如下的特性:

  1. 它提供了创建(或者装配)对象实例的机制,而这些对象实例可能还包含了其它被依赖的对象实例。

  2. Unity允许将预先配置的对象注入到类中,实现了inversion of control (IoC)的功能。在Unity中,支持constructor injection(构造器注入), property setter injection(属性设值注入)以及method call injection(方法注入)。ps:这里的方法注入与Martin Fowler定义的接口注入类似而稍有区别。

  3. 支持容器的体系结构。一个容器可以有子容器,允许从子容器到父容器的对象定位查询。

  4. 可以通过配置文件进行准备和配置容器。

  5. 不会影响到类的定义(属性设值注入和方法注入除外),这也是轻量级容器的一个体现。

  6. 支持自定义的容器扩展。

  
   使用Unity,最基本步骤有三步。

  1. 建立容器;

  2. 将接口与类的映射注册到容器中;

  3. 从容器中解析出正确的对象。

 

      例子:

  Step0. 准备工作

  ILogger接口:

  

  ConsoleLogger类:

  

  NullLogger类:

  Step1. 创建容器

  在Unity中创建容器实例最简单的方法是直接使用构造函数创建,如下代码所示:

  IUnityContainer container = new UnityContainer();

  Step2. 注册接口映射

  在Unity中提供了一组Register方法供我们在容器中注册接口映射,如下代码所示:

  container.RegisterType<ILogger, ConsoleLogger>();

  Step3. 获取对象实例

  在Unity中提供了一组Resolve方法用以获取对象实例,如下代码所示:

  ILogger logger = container.Resolve<ILogger>();

  OK,就这么简单!

  测试:

  场景一:注册一个ConsoleLogger作为ILogger的实现到容器中,然后从容器中解析ILogger的实现,并调用ILogger的Log方法。

  结果:

  场景二:注册一个NullLogger作为ILogger的实现到容器中,然后从容器中解析ILogger的实现,并调用ILogger的Log方法。

  结果: