• 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.   
    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 { get; set; }  
    7. }  
    8.   
    9. /// <summary>  
    10. /// 小鸟的家  
    11. /// </summary>  
    12. public class BirdHome : IBirdHome  
    13. {  
    14.     public IBird Swallow { get; set; }  
    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 { 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.         }  

    运行结果依然是:

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

    生命不息,编程不止!

  • 相关阅读:
    EasyDSS前端界面在页面缩小时内置列表仍需手动刷新的优化
    【解决方案】家庭保姆犯罪案频出,EasyDSS视频监控平台如何确保家政安全?
    EasyDSS现场录视频流合成后出现视频内容部分丢失的问题排查及解决
    TSINGSEE青犀视频基于流媒体技术EasyDSS搭建酒店IPTV直播/点播平台
    EasyDSS视频直播列表页面横向滚动条和纵向滚动条不能同步的问题优化
    【解决方案】电力巡检进入智能化时代,无人机+EasyDSS开启智能巡检新模式
    EasyDSS新内核版本测试删除录像文件后存在残留问题调整优化
    IT常识
    Java面试题+算法案例
    数据库理论概述
  • 原文地址:https://www.cnblogs.com/jiajinyi/p/4312952.html
Copyright © 2020-2023  润新知