zoukankan      html  css  js  c++  java
  • C# IoC 容器

     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.   
    9.            bird.Say();  
    10.              
    11.            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.   
    7. IBird bird = unityContainer.Resolve<IBird>();  
    8.   
    9. bird.Say();  
    10.   
    11. 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.   
    7. IBird swallow = unityContainer.Resolve<IBird>("Swallow");  
    8. IBird sparrow = unityContainer.Resolve<IBird>("Sparrow");  
    9.   
    10. swallow.Say();  
    11. sparrow.Say();  
    12.   
    13. Console.Read();  


    运行结果:

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

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

     

    (二) Unity的构造函数注入

     

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

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

     

    main方法如下:

    [csharp] view plaincopy
     
    1. //实例化一个控制器  
    2. IUnityContainer unityContainer = new UnityContainer();  
    3. //实现注入  
    4. unityContainer.RegisterType<IBird, Swallow>();  
    5. unityContainer.RegisterType<IBirdHome, BirdHome>();  
    6.   
    7. IBirdHome birdHome = unityContainer.Resolve<IBirdHome>();  
    8. birdHome.Swallow.Say();  
    9.   
    10. 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 { getset; }  
    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.         }  

     

    运行结果依然是:


     

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

     

  • 相关阅读:
    Cpp Singleton
    回溯法( Backtracking Algorithms ) :C语言Maze迷宫问题(自己实现)
    First wxWidgets Demo, wxWidgets简单示例
    copy contructor拷贝构造函数 (Copy Control)
    UPX (Ultimate Packer for eXecutables) 多平台可执行文件压缩
    wxWidgets Event Handling
    WxWidgets 安装与测试
    顺序查找 sequential find
    HDU1171 Big Event in HDU 背包
    HDU2091 水题
  • 原文地址:https://www.cnblogs.com/fx2008/p/3561377.html
Copyright © 2011-2022 走看看