原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(八) Unity Dependency Injection and Interception

依赖注入容器Unity:

Unity的构造类似于Castle中的IOC(控制反转 或者叫依赖注入)容器,我们使用抽象接口来隔离使用者和具体实现之间的依赖关系,但是不管再怎么抽象,最终还是要创建具体实现类的实例,这种创建具体实现类的实例对象就会造成对于具体实现的依赖,为了消除这 种创建依赖性,需要把依赖移出到程序的外部(比如配置文件)。使用依赖注入后,这些类完全是基于抽象接口编写而成的,所以可以最大限度地适应需求的变化。 依赖注入的形式有三种,分别为构造子注入(Constructor Injection)、设值方法注入(Setter Injection)和接口注入(Interface Injection)。

还是和以前一样,我们用实际的需求来做演示,说明这个模块到底能解决什么实际的问题吧(以下的例子是仿照TerryLee的文章: Castle IOC容器快速入门,在此我使用Unity来恢复现场,给大家演示如何用Unity解决相同的问题 ):

现在假如我们有这样一个需求,开发一个日志组件,把日志信息输出到文本文件,同时对输出的信息进行格式化,以示意性的代码来实现.

1.创建一个新的控制台应用程序,加入需要的Dll文件,并添加需要的引用:

添加引用:

using Microsoft.Practices.Unity;

2.测试:

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity;

namespace test
{
class Program
{
staticvoid Main(string[] args)
{
Console.WriteLine("测试一:");
test1();

Console.WriteLine("测试二:");
test2();
}

privatestaticvoid test1()
{
//1. 日志格式化只是日志服务中的一个组件.(注:在此实例化该组件没有多大意义,唯一用处只是用来给服务提供一个参数)
ILogFormatter logFormatter =new TextFormatter("/");

//2.创建服务
ILog logServer =new TextFileLog(@"C:\test.log",logFormatter);

//3.使用服务
logServer.Write("日志正文");
}

privatestaticvoid test2()
{
//1.注册了一个容器;
IUnityContainer container =new UnityContainer();

//2.向容器中注册ILog服务,并告诉容器用TextFileLog实现这个服务
container.RegisterType<ILog, TextFileLog>();

//3.向容器中注册ILogFormatter,并告知容器用TextFormatter实现它
// 容器发现类的构造函数还需要另外一个参数Target,这里用InjectionProperty注入该参数
container
.RegisterType<ILogFormatter, TextFormatter>(new InjectionProperty("Target", "/"))
.RegisterInstance<string>(@"C:\test.log");

//4.获取服务
ILog log = container.Resolve<ILog>();

//5.使用服务,到此为止我们都没有使用new关键字创建一个具体类的实例,
// 完全屏蔽了组件和服务的实例化,而由Unity自动装配,使得程序更加的灵活.
log.Write("日志正文");
}
}

}

运行结果:

到此为止,我们从中要了解到几个知识点:

1.服务

服务是一个个的接口, 接口约定了服务,从而使随意替换服务的实现对使用接口服务的代码没有任何的影响。像我们上面例子中的ILog,ILogFormatter都是一个个服务,我们在这个例子中支实现了一个文本文件的日志记录,如果你要是实 现数据库记录的日志记录,都必须要遵守ILog这个接口。

2.组件

简单来说组件是一个可 重用的程序单元,它实现了某个接口,并仅仅只实现了这一个良好的接口。也就是说,组件是实现了某个服务接口的类。像上例中的TextFileLog,TextFormatter都 是组件

3.自动装配

在上面的例子中,大家 可能都已经注意到了,TextFileLog依赖于TextFormatter, 我们却没有在配置文件中指定它们之间的依赖关系,这就是Castle IOC聪明的一个地方,它能 够自动管理组件之间的依赖关系,而无需编写特定的xml config来配置,即自动装配的意思。

这里还有篇从别的网站Copy过来的IOC介绍,很形象生动,希望对大家的理解有所帮助:

Spring框架中也有IoC(Inversion of Control,控制倒转)。并且是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和 对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传 统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
  那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

文中示例程序下载:

(> ' []' )>  点击下载  <( '[] '< )

黄聪:Microsoft Enterprise Library 5.0 系列教程(八) Unity Dependency Injection and Interception的更多相关文章

  1. 黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block 开发人员经常编写需要安全功能的应用程序.这些应用程序 ...

  2. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...

  4. 黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block 企业库日志应用程序模块工作原理图:   从上图我们可以 ...

  5. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...

  6. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级) Caching Application Bl ...

随机推荐

  1. MongoDB学习笔记(四) 用MongoDB的文档结构描述数据关系

    MongoDB的集合(collection)可以看做关系型数据库的表,文档对象(document)可以看做关系型数据库的一条记录.但两者并不完全对等.表的结构是固定的,MongoDB集合并没有这个约束 ...

  2. 『openframeworks』shader制作三角形马赛克效果

    不久前做了六边形马赛克的效果,很有意思,乘热打铁,弄了个三角形马赛克. 首先肯定是等边三角形,这样才能真正的无缝拼接.观察发现,三角形可以拼接成之前做个的六边形. 如下图: 我们可以发现6个三角形正好 ...

  3. VC添加背景图片 的一种方法

    .如果程序是新建的对话框,要给其添加背景图片的步骤: 1)加入消息函数:afx_msg void OnPaint(); 2)BEGIN_MESSAGE_MAP(QueryDlg, CDialog) O ...

  4. Windows XP 如何查看计算机开关机记录

    在Windows XP中,我们可以通过“事件查看器”的事件日志服务查看计算机的开.关机时间.因为事件日志服务会随计算机一起启动和关闭,并在事件日志中留下记录. 在这里有必要介绍两个ID号:6006和6 ...

  5. 在SharePoint 2010中部署RBS (转)

    一.RBS(Remote BLOB Storage)简单介绍 在SharePoint的大部分企业应用案例中,SharePoint都是要承担着非常繁重的文件管理工作,这些文件类型包含了Word文档,Ex ...

  6. 禁用掉用户帐号,用户Lync客户端仍然可以登录!

    问题: 有这样的一个情况,一位具有LYNC权限的用户离职了,AD账号已经禁用.LYNC和邮箱功能暂时保留.可用户离职4天了,还能够正常登录到LYNC,能够正常发送和接收即时消息.我经过测试,确实AD账 ...

  7. Cocos2d-x 3.1.1 学习日志8--2分钟让你知道cocos2d-x3.1.1 文本类别

    实际上文本经常使用的三个,LabelTTF,LabelBMF和LabelAtlas.而他们使用非常相似.所以,你会只举一反三,非常快就能够掌握了. <span style="font- ...

  8. UVAlive 2519 Radar Installation (区间选点问题)

    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...

  9. FZU2177(dp)

    传送门:ytaaa 题意:有n个***(不能调换顺序),可以组成x(x<n)个炸弹,每个炸弹的威力为该组的(max-min)^2,现在给出n个***的威力值,求能组成所有炸弹的最大威力和. 分析 ...

  10. hdu3829(最大独立集)

    传送门:Cat VS Dog 题意:动物园有N只猫,M只狗,P个小孩.每个小孩都有自己喜欢的动物和讨厌的动物,如果他喜欢狗,那么就讨厌猫, 如果他讨厌狗,那么他就喜欢猫.某个小孩能开心,当且仅当他喜欢 ...