Unity IOC容器的简单应用(转)

转自:http://blog.csdn.net/wanzhuan2010/article/details/7763280

Unity是Unity是微软patterns& practices组用C#实现的轻量级,可扩展的依赖注入容器,它为方便开发者建立松散耦合的应用程序,

有以下优点:

1.简化了对象的创建,特别是针对分层对象结构和依赖关系;

   2.需求的抽象,允许开发人员在运行时或配置文件中指定依赖关系,简化横切关注点的管理;

   3.推迟为容器配置组件的时机,增加了灵活性;

   4.服务定位能力,这使客户能够存储或缓存容器;

5.实例和类型拦截

下载地址: http://unity.codeplex.com/

目前最新的版本为 unity 3.0 for .net 3.5 preview

以下程序用的是2.1版本

下面开始Unity之旅

 

 (一) 我的第一个Unity Demo

 

新建一个控制台应用程序,引用Microsoft.Practices.Unity.dll文件;

新建一个鸟类的接口,定义一个鸟叫的方法;

[csharp] view plaincopy

  1. /// <summary>
  2. /// 鸟类接口
  3. /// </summary>
  4. public interface IBird
  5. {
  6. /// <summary>
  7. /// 讲话
  8. /// </summary>
  9. void Say( );
  10. }

对这个接口进行实现:

[csharp] view plaincopy

  1. /// <summary>
  2. /// 燕子
  3. /// </summary>
  4. public class Swallow : IBird
  5. {
  6. public void Say( )
  7. {
  8. Console.WriteLine("燕子在叫...");
  9. }
  10. }

在Mian方法中通过Unity实现IOC反转控制;

[csharp] view plaincopy

  1. static void Main( string[] args )
  2. {
  3. //实例化一个控制器
  4. IUnityContainer unityContainer = new UnityContainer();
  5. //实现注入
  6. unityContainer.RegisterType<IBird, Swallow>();
  7. IBird bird = unityContainer.Resolve<IBird>();
  8. bird.Say();
  9. Console.Read();

运行结果:

这个小实例已经实现了简单的IOC控制反转.

当一个接口有两个实现怎么办呢?是不是在加一个类似于下边的代码就行了呢? 下面试一下.

unityContainer.RegisterType<IBird, Swallow>();我们在原有的程序中加一个Sparrow类,实现IBird接口:

[csharp] view plaincopy

  1. public class Sparrow : IBird
  2. {
  3. public void Say()
  4. {
  5. Console.WriteLine("麻雀在叫....");
  6. }
  7. }

Main方法代码:

[csharp] view plaincopy

  1. //实例化一个控制器
  2. IUnityContainer unityContainer = new UnityContainer();
  3. //实现注入
  4. unityContainer.RegisterType<IBird, Swallow>();
  5. unityContainer.RegisterType<IBird, Sparrow>();
  6. IBird bird = unityContainer.Resolve<IBird>();
  7. bird.Say();
  8. Console.Read();

运行一下,结果:

嗯?这是什么情况,为什么是麻雀在叫..而不是燕子叫呢? 原来

当一个接口有多个实现,而且没有用别名区分时,就会选择最后一个注入的实现;

下边给每个注入都加上别名:

[csharp] view plaincopy

  1. //实例化一个控制器
  2. IUnityContainer unityContainer = new UnityContainer();
  3. //实现注入,用别名区分实现
  4. unityContainer.RegisterType<IBird, Swallow>("Swallow");
  5. unityContainer.RegisterType<IBird, Sparrow>("Sparrow");
  6. IBird swallow = unityContainer.Resolve<IBird>("Swallow");
  7. IBird sparrow = unityContainer.Resolve<IBird>("Sparrow");
  8. swallow.Say();
  9. sparrow.Say();
  10. Console.Read();

运行结果:

这才是我们想要的结果,哈哈.....

当一个接口有多个实现时,需要通过别名区分。

(二) Unity的构造函数注入

 

新建 一个IBirdHome 接口,并对接口进行实现:

[csharp] view plaincopy

  1. /// <summary>
  2. /// 小鸟的家
  3. /// </summary>
  4. public interface IBirdHome
  5. {
  6. IBird Swallow { get; set; }
  7. }
  8. /// <summary>
  9. /// 小鸟的家
  10. /// </summary>
  11. public class BirdHome : IBirdHome
  12. {
  13. public IBird Swallow { get; set; }
  14. public BirdHome(IBird bird)
  15. {
  16. this.Swallow = bird;
  17. }
  18. }

main方法如下:

[csharp] view plaincopy

  1. //实例化一个控制器
  2. IUnityContainer unityContainer = new UnityContainer();
  3. //实现注入
  4. unityContainer.RegisterType<IBird, Swallow>();
  5. unityContainer.RegisterType<IBirdHome, BirdHome>();
  6. IBirdHome birdHome = unityContainer.Resolve<IBirdHome>();
  7. birdHome.Swallow.Say();
  8. Console.Read();

运行结果:

我们只是通过Unity得到了一个IBirdHome实现,但并没有对 IBird Swallow { get; set; } 进行实例化,但结果已经运行出来,并没有报错.

原来这些工作Unity已帮我们做了,我们可以偷个懒了.嘿嘿.......

(三)属性注入

 

把BirdHome类的中构造函数去掉,在属性上加上[Dependency]特性

[csharp] view plaincopy

  1. /// <summary>
  2. /// 小鸟的家
  3. /// </summary>
  4. public class BirdHome : IBirdHome
  5. {
  6. /// <summary>
  7. /// 属性注入
  8. /// </summary>
  9. [Dependency]
  10. public IBird Swallow { get; set; }
  11. }

运行结果与上结果一样,亲,不信,试试!

(四) 初使化器注入(自已起的名字)

初使化器注入与构造函数注入相似,但不用写到构造函数里边,而是在初使化方法上加上[InjectionMethod]特性

[csharp] view plaincopy

  1. /// <summary>
  2. /// 初始化器注入
  3. /// </summary>
  4. /// <param name="bird"></param>
  5. [InjectionMethod]
  6. public void Initialize(IBird bird)
  7. {
  8. this.Swallow = bird;
  9. }

运行结果依然是:

欢迎大家前来拍砖........!

生命不息,编程不止!

时间: 2024-09-30 11:37:48

Unity IOC容器的简单应用(转)的相关文章

总结Unity IOC容器通过配置实现类型映射的几种基本使用方法

网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new UnityContainer(); //实例化一个容器 unityContainer.RegisterType<IClassTest, ClassTest>(); //注册类型映射 unityContainer.Resolve<IClassTest>();//解析并获取类型的实例 然而实际

Unity IOC容器通过配置实现类型映射的几种基本使用方法

网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下 unityContainer = new UnityContainer(); //实例化一个容器 unityContainer.RegisterType<IClassTest, ClassTest>(); //注册类型映射 unityContainer.Resolve<IClassTest>();//解析并获取类型的实例 然而实际情

几句代码简单实现IoC容器

前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成对象,然后将对象保存,调用的时候进行单例调用,而且,代码中不会存在 new 字眼.所有实例对象的创建和映射都在容器中实现.当然,还是用第三方的容器比较稳妥,本文中只是很简单的一个示范.具体理解的是否正确,我也不敢说,只不过,能达到一些预期的效果,功能不够强大. 解析 首先,我们先添加几个接口.ISe

Spring.net(二)----初探IOC容器

我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口.  IObjectFactory接口和IApplicationContext接口:他两个称为“容器”或“IOC容器”. Spring.net框架的核心原则是非侵入性.  IObjectFactory接口是初始化.配置及管理对象的实际容器.  IObjectFactory全限定名为Spring.Objects.Factory.IObjec

介绍 Spring IoC 容器和 bean

简介 本章涵盖了 Spring Framework实现控制翻转 (IoC) 的原则. IoC 有时也被称为依赖注入 (DI).这是一个对象定义他们依赖的过程,其中对象之间的相关性,也就是说,它们一起工作,只能通过构造函数参数,参数工厂方法或设置在其构造后的对象实例或者是从一个工厂方法返回的对象实例的属性上.容器在创建的 bean 注入这些依赖.这个过程是根本的反转,因此称为控制反转(IoC),bean 本身通过直接构造类,或作为 Service Locator(服务定位器)模式的机制,来控制其依

C# Ioc容器Unity,简单实用

原文:C# Ioc容器Unity,简单实用 开头先吐槽一下博客园超级不好用,添加图片后就写不动字了,难道是bug 好进入正题,先来说下依赖注入,简单来说就是定义好接口,上层代码调用接口,具体实现通过配置文件方式去指定具体实现类. 首先我们需要通过nuget来安装unity 安装好后就可以写一个方法类去实现依赖注入 public class UnityIocHelper : IServiceProvider { private readonly IUnityContainer _container

比Spring简单的IoC容器

比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring的内部运行机制,阅读它的代码非常重要, 但是往往它的代码非常的"多". 现在根据Spring对Bean的生命周期的处理, 编写出一款非常小的IoC容器, 没有了对XML的解析,而是通过对Config对象的构造而完成IoC配置文件的声明, 相比较XML的方式, 对重构软件非常具有好处, 并且

Spring容器的简单实现(IOC原理)

引言:容器是什么?什么是容器?Spring容器又是啥东西?我给Spring容器一个对象名字,为啥能给我创建一个对象呢? 一.容器是装东西的,就像你家的水缸,你吃饭的碗等等. java中能作为容器的有很多,例如Map,List,数组.....还有好多 二.Spring 容器的核心就是一个Map集合(可能不是很准确,见谅!) Map<String, Object> 这个容器里根据key-value存放了好多键值对.假如你给一个String的key,就能获得相应的Object的对象,各位大佬,对Sp

Spring Ioc容器的一点简单理解

一个简单的例子 Ioc(Inversion of Control),控制反转.名字起得比较高大上,事实上是一种工程思想,不仅适用于编程领域.我用一个简单的例子来说明IoC: 假设我们到一个餐馆里去吃饭,这个餐馆有成百上千个厨师,每位厨师只能做一样菜,这时候客人应该怎样点菜? 直接到厨房去寻找厨师,找到对应的厨师做菜 向服务员下单,由服务员将菜式需求统一报给对应厨师烹饪 正常思维都会选择第二种方法,然而我们之前的编程经常采用第一种方法:定义好类后,在执行的主程序中直接创建对应对象进行使用.假如有成