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

推荐订阅源

T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
S
SegmentFault 最新的问题
Schneier on Security
Schneier on Security
W
WeLiveSecurity
Webroot Blog
Webroot Blog
T
Threatpost
量子位
大猫的无限游戏
大猫的无限游戏
C
Cisco Blogs
腾讯CDC
N
News | PayPal Newsroom
T
Troy Hunt's Blog
T
Tailwind CSS Blog
Latest news
Latest news
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The Register - Security
The Register - Security
Know Your Adversary
Know Your Adversary
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Engineering at Meta
Engineering at Meta
SecWiki News
SecWiki News
MyScale Blog
MyScale Blog
GbyAI
GbyAI
Application and Cybersecurity Blog
Application and Cybersecurity Blog
A
Arctic Wolf
The GitHub Blog
The GitHub Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
有赞技术团队
有赞技术团队
NISL@THU
NISL@THU
L
LINUX DO - 最新话题
雷峰网
雷峰网
P
Privacy International News Feed
Spread Privacy
Spread Privacy
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
月光博客
月光博客
V
V2EX
H
Help Net Security
博客园 - 三生石上(FineUI控件)
U
Unit 42
B
Blog
PCI Perspectives
PCI Perspectives
G
GRAHAM CLULEY
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
Last Week in AI
Last Week in AI

博客园 - 赤脚小子

Workflow WF Reference Links for 2009-03-20 Workflow WF Reference Links for 2009-03-06 Workflow WF Reference Links for 2009-02-20 Workflow WF Reference Links for 2009-02-13 Workflow WF Reference Links for 2009-02-06 Workflow WF Reference Links for 2009-02-01 Workflow WF Reference Links for 2009-01-16 Workflow WF Reference Links for 2009-01-09 Workflow WF Reference Links for 2008-12-30 WF书籍导读(完整版) WF书籍推荐 Unity(七):使用场景Ⅲ:用于依赖注入(下) Unity系列目录 Unity(五):使用场景Ⅱ:用于单例模式 Unity(四):使用场景Ⅰ:建立类型映射 Unity(三):快速入门 Unity(二):Unity是什么? Unity(一):从ObjectBuilder说起 Exception Management in .NET阅读笔记
Unity(六):使用场景Ⅲ:用于依赖注入(上)
赤脚小子 · 2008-05-14 · via 博客园 - 赤脚小子

我们说到哪了...

有关依赖注入

什么是依赖注入,我想这个问题我在这里说就不大合适了,所以还是推荐一下大师的文章。之前的文章也提到过,“Martin FowlerInversion of Control Containers and the Dependency Injection pattern 是不得不推荐的,当然,如果读起来比较费劲的话,吕震宇的你真的了解Ioc与AOP吗?系列也是不错的参考”。

这里要多说一句的是,依赖注入(Dependency Injection)和控制反转(Inversion of Control)并不是同一个概念,有的人经常混在一起。有关这一点,看看前面说的Martin的文章就明白了。

准备工作 

为了接下来的说明,我们先编写几个后面需要的接口和类。

注:本文涉及到的IOrder接口、CommonOrder类、VipOrder类和ILogger接口、ConsoleLogger类、NullLogger类等代码请参见Unity(三):快速入门Unity(五):使用场景Ⅱ:用于单例模式中的准备代码,这里不再重复。

IOrderWithLogging接口:

image

Unity支持的依赖注入方式有三种:构造器注入、设值注入、方法调用注入。

构造器注入

对于构造器注入,Unity支持两种方式的依赖注入:自动依赖注入和通过打标签标识。具体来说,对于只有单一构造函数的目标类,可以使用自动依赖注入的方式,而对于有多个构造函数的目标类,则应该使用在构造函数上打标签的方式来进行注入。

  • 单构造器自动注入

下面是我们的目标类SingleConstructor,可以看到,SingleConstructor类只有一个构造函数,构造函数中有两个参数:IOrder和ILogger。

image

下面是我们的测试代码。首先,我们建立容器,然后在容器中注册了IOrder和ILogger的具体类,同时将SingleConstructor注册为IOrderWithLogging的具体类。

在这里,我们将CommonOrder注册为单例,并为它的单实例的Discount赋值为0.8,这样做的目的是为了检验取出的IOrder的具体类为我们先前的注入到容器的CommonOrder类。

image

下面是输出结果。

image

  • 多构造器打标签注入

下面是我们的目标类MultipleConstructor,可以看到,MultipleConstructor类有两个构造函数,一个不带参数,一个有两个参数:IOrder和ILogger,后者打了InjectionConstructor标签。

image

下面是我们的测试代码。思路与上面的例子类似,在这里我们把IOrder和ILogger对应的具体类换成了VipOrder和NullLogger,IOrderWithLogging对应的具体类换成了MultipleConstructor。

image

下面是输出结果。

 image

这里需要注意的是,如果在上面的 MultipleConstructor类中,我们不打InjectionConstructor标签,运行结果是一样的,大家可以自己试验一下。

这是因为对于具有多个构造器的目标类,如果没有发现标有InjectionConstructor标签的构造器,Unity会自动使用参数最多的构造器。如果发现参数最多的构造器同时有多个,那么就会在运行时抛出一个异常。比如说,如果我们的MultipleConstructor类中构造函数不打InjectionConstructor标签,同时还有一个构造函数也有两个参数,结果就是这样。