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

推荐订阅源

S
Securelist
O
OpenAI News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Google Online Security Blog
Google Online Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
N
News and Events Feed by Topic
S
Security Affairs
SecWiki News
SecWiki News
Project Zero
Project Zero
L
Lohrmann on Cybersecurity
P
Proofpoint News Feed
P
Palo Alto Networks Blog
L
LINUX DO - 最新话题
H
Hacker News: Front Page
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
Intezer
Simon Willison's Weblog
Simon Willison's Weblog
W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
K
Kaspersky official blog
The GitHub Blog
The GitHub Blog
I
InfoQ
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
B
Blog
IT之家
IT之家
AWS News Blog
AWS News Blog
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Google DeepMind News
Google DeepMind News
Spread Privacy
Spread Privacy
N
News and Events Feed by Topic
Security Latest
Security Latest
美团技术团队
C
Check Point Blog
WordPress大学
WordPress大学
T
Tenable Blog
S
Security @ Cisco Blogs
Last Week in AI
Last Week in AI
博客园 - 聂微东
月光博客
月光博客
博客园 - 【当耐特】
S
Schneier on Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Secure Thoughts
Schneier on Security
Schneier on Security
C
Cisco Blogs
Cyberwarzone
Cyberwarzone

博客园 - 执法长老

软件开发模型 Enterprise Library 3.1中文文档 深入 Unity 1.x 依赖注入容器之四:依赖注入 深入 Unity 1.x 依赖注入容器之三:获取对象 深入 Unity 1.x 依赖注入容器之二:初始化 Unity Wrapper API for using Microsoft Active Directory Services Microsoft .NET Pet Shop 4 架构与技术分析 Unity 1.0 中文文档:1 - Unity 简介 二、ASP.NET Runtime Pipeline(续ASP.NET Http Runtime Pipeline - Part I)(转) ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part I(转) ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI(转) 深入剖析ASP.NET的编译原理之二:预编译(Precompilation)(转) 深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation)(转) 使用 Unity (三):理解和使用依赖注入的键 使用 Unity(二):配置 Unity 、读取配置信息和获取对象 使用PIAB和VAB实现业务实体的自动验证 使用 Unity(一):Unity 应用程序块容器介绍 SQL Server性能优化的一些简单技巧 Unity&Webform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面 (转)
深入 Unity 1.x 依赖注入容器之一:入门
执法长老 · 2008-12-17 · via 博客园 - 执法长老

原文链接: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 中文文档》。