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文件;

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

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

对这个接口进行实现:

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

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

  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接口:

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

Main方法代码:

  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();

运行一下,结果:

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

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

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

  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 接口,并对接口进行实现:

  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方法如下:

  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]特性

  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]特性

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

运行结果依然是:

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

C# IoC 容器的更多相关文章

  1. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  2. IL实现简单的IOC容器

    既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...

  3. 通过中看不中用的代码分析Ioc容器,依赖注入....

    /** * 通过生产拥有超能力的超人实例 来理解IOC容器 */ //超能力模组接口 interface SuperModuleInterface{ public function activate( ...

  4. Spring在非web应用中关闭IoC容器 (registerShutdownHook)

    在基于web的ApplicationContext实现中,已有相应的实现来处理关闭web应用时恰当地关闭Spring IoC容器.但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如 ...

  5. .net自带的IOC容器MEF使用

    IOC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序. 控制反转: 将控制权移交给第三方容器  new 操作 依赖注入: 在程序 ...

  6. NET 自带IOC容器MEF指初体验

    转自:http://www.cnblogs.com/ulex/p/4186881.html IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动 ...

  7. 自定义模拟一个Spring IOC容器

    一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...

  8. IoC原理-使用反射/Emit来实现一个最简单的IoC容器

    从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...

  9. Spring框架IOC容器和AOP解析

    主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.S ...

  10. Lind.DDD.IoC(大叔推荐)~在服务定位器中引入IoC容器~容器的适配器

    回到目录 关于依赖倒置(DIP) 高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口,通俗的讲,就是高层模块定义接口,低层模块负责实现,这在我们实际开发中经常被用到,层与层之间引用,经 ...

随机推荐

  1. c# WPF 项目优化

    业务流程图 优化前后对比: 优化过程: 1. 界面刷新,特别是表格刷新 把ListView.DataContext  = DataSet 这些代码替换成以下: public static void S ...

  2. Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器

    1.概述 本篇博客的产生呢,是因为,群里的哥们暖暖给我发了个效果图,然后问我该如何实现顶部ViewPager指示器的字体变色,该效果图是这样的: 大概是今天头条的app,神奇的地方就在于,切换View ...

  3. Java基础知识强化64:基本类型包装类的引入

    1. 基本类型包装类概述 (1)将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. (2)常用的操作的之一:用于基本数据类型与字符串之间的转换. (3)基本类型和包装类的对应 ...

  4. 使用VisualVM查看Java Heap Dump

    浏览Heap Dump 可以使用VisualVM浏览heap dump文件的内容,从而快速查看在堆中分配的对象.Heap dumps在主窗口的heap dump子标签页中显示.你可以打开保存在本地的h ...

  5. javascript sort 用法

    <html> <head> <title></title> <script type="text/javascript" sr ...

  6. css3圈圈进度条

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  7. 高性能ORM框架XLinq功能详细介绍

    之前简单介绍了XLinq的一些功能,有很多功能都没有提到,现在给XLinq加了一些功能,这次把所有功能都介绍一遍. 设计目标 易用性 在使用一个框架的时候 应该没几个人会喜欢写一大堆的配置文件吧 也应 ...

  8. java下io文件切割合并功能加配置文件

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  9. C++ 基本数据结构整理

    Hash Map (Unordered_map) Insert #include <unordered_map> using namespace std; unordered_map &l ...

  10. uva 10125 - Sumsets

    题意: 输入n,然后输入n个数字,,要在这n个数字中找出a,b,c,d..满足a,b,c,d是不同元素,并且a + b + c = d...求出最大的d 直接暴力时间复杂度为O(n^4)..会超时.. ...