惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
量子位
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
AWS News Blog
AWS News Blog
T
Threat Research - Cisco Blogs
博客园 - Franky
Vercel News
Vercel News
H
Help Net Security
Martin Fowler
Martin Fowler
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Cyberwarzone
Cyberwarzone
W
WeLiveSecurity
V2EX - 技术
V2EX - 技术
C
CERT Recently Published Vulnerability Notes
S
Secure Thoughts
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog RSS Feed
H
Hacker News: Front Page
P
Proofpoint News Feed
博客园 - 聂微东
N
News and Events Feed by Topic
C
Cybersecurity and Infrastructure Security Agency CISA
D
Docker
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
S
Security @ Cisco Blogs
博客园 - 【当耐特】
F
Fortinet All Blogs
The Register - Security
The Register - Security
A
About on SuperTechFans
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
NISL@THU
NISL@THU
Attack and Defense Labs
Attack and Defense Labs
Help Net Security
Help Net Security
Cisco Talos Blog
Cisco Talos Blog
月光博客
月光博客
IT之家
IT之家
有赞技术团队
有赞技术团队
Know Your Adversary
Know Your Adversary
Hugging Face - Blog
Hugging Face - Blog

博客园 - Dorian Deng

IE9 支持的是 H.264 视频标准,不是苹果 Safari 深入 Unity 1.x 依赖注入容器之四:依赖注入 深入 Unity 1.x 依赖注入容器之三:获取对象 深入 Unity 1.x 依赖注入容器之二:初始化 Unity Unity 1.0 中文文档:1 - Unity 简介 Unity Feb 26 Weekly Drop 使用 Unity Application Block(三):理解和使用依赖注入的键 使用 Unity(二):配置 Unity 、读取配置信息和获取对象 使用 Unity(一):Unity 应用程序块容器介绍 EntLib 4.0 和 Unity 的开发团队 [译]EntLib V4 产品需求总表(Product Backlog)(更新:2008-1-14) 简单是一种美:提高项目成功率的一些方法 Enterprise Library 异常处理应用程序块的设计 Enterprise Library 异常处理应用程序块关键场景 Enterprise Library 异常处理应用程序块开发任务的细节 使用 Enterprise Library 异常处理应用程序块开发 Enterprise Library 异常处理应用程序块简介 Enterprise Library 数据访问应用程序块快速入门 Enterprise Library 数据访问应用程序块的部署和操作
深入 Unity 1.x 依赖注入容器之一:入门
Dorian Deng · 2008-05-21 · via 博客园 - Dorian Deng

原文链接:http://www.doriandeng.cn/archives/95.html

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 容器,它可以用代码或配置文件来进行类型的注册,同时支持构造函数注入、属性注入和方法调用注入。

源代码下载

look-into-unity-1-x.zip

理想&美人