深入 Unity 1.x 依赖注入容器之一:入门

原文链接:http://www.doriandeng.cn/post/2008/05/look-into-unity-1-x-quickstart.aspx

Unity 是由微软开发的一个轻量级、可扩展的依赖注入(Dependency Injection, DI)容器,支持构造函数、属性和方法的依赖注入。所谓依赖的注入,即将程序开发过程中的对象与其所依赖的具体对象解耦,从一定程度上仅关注对所依赖对象的使用,却不管其具体对象是哪个类的实例;而真正的被依赖对象在运行时由容器注入。本质上,它就是一个对象工厂和对象管理器。更详细的信息,请参见《IoC 容器和Dependency Injection 模式》。

Unity 适用于可扩展、可插接的应用程序的开发,对于普通的、不要求插接的应用程序的开发反而会增加开发的复杂度。Unity 的使用对性能也会有少量的影响 。

准备

在本系列的文章中,我们假设有一个 Telephone 类,一个 IDialer 接口和一个 Dialer 抽象类。如下代码所示:

 

Unity 的初始化

Unity 容器在使用前一般需要针对所使用的对象类型进行初始化,某些时候也可以不进行初始化。Unity 容器的初始化主要是对象类型的注册。这可以用二种方法完成,一是使用 .NET 代码,另一种就是使用 XML 配置文件。在 Unity 文档的示例中,绝大多数的示例都是使用代码的方法来对 Untiy 进行初始化,这也给不少人造成了使用 Unity 容器来管理对象比直接使用更复杂的错觉。本文将同时使用代码和 XML 配置文件的方法来对初始化及其其他相关方面进行说明,以便大家对 Unity 能有更全面、更正确的认识。

类型注册

首先,在代码文件中添加对 Microsoft.Practices.Unity 命名空间的引用。

然后,可以用代码方式进行如下的注册,(其中的 ButtonTypeDialer 类包含在供下载的源代码中。):

运行结果如下:

 

下面,我们看看用 XML 如何来进行初始化。

首先,在配置文件中,需要添加下列配置节声明:

然后,配置类型注册:

最后,我们可以用下列的方式来使用:

 

由上面的代码我们可以看出,在完成 Unity 的容器初始化后,使用的方法是一样的。

 构造函数注入

实质上,上面的示例我们可以用如下代码来实现:

 

这二段代码唯一的不同就是 38、39 行合并成了 52 这一行。这就是利用了构造函数注入。

在 Telephone 类中,我们声明了一个  public Telephone(IDialer dialer) 的构造函数,而在 Unity 容器中,已进行了用于 IDialer 接口的注册,所以在使用 Unity 容器的 Resolve 方法获取对象时,就自动调用了此构造函数对对象进行了初始化。如果不存在这样的构造函数,Unity 容器将自动调用其默认构造函数进行初始化。

如果同时存在多个带参数的构造函数,就需要用 [InjectionConstructor] 特性来指定将使用的构造函数。

属性注入

要使用属性注入,我们需要在 Telephone 类的 Dialer 属性上加上 [Dependency] 特性声明,如下所示:

同时,在配置文件中加入如下配置以注册 Dialer 抽象类的映射:

 

这样,构造函数注入中的示例代码就依然是有效的,虽然构造函数已被注释掉了。

方法调用注入

我们对 Telephone 类做进一步的修改,注释掉 [Dependency] 特性,添加一个 Initialize 方法:

 

在 Initialize 方法上,我们加上了 [InjectionMethod] 以指出使用了方法调用注入的方法。这也使得在构造函数注入中所使用的示例代码依然有效。

总结

Unity 是一个轻量级、可扩展的 DI 容器,它可以用代码或配置文件来进行类型的注册,同时支持构造函数注入、属性注入和方法调用注入。


更多信息,请参考《Unity 1.x 中文文档》。

posted on 2008-12-17 14:10  执法长老  阅读(3909)  评论(1编辑  收藏  举报

导航