注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

Unity IOC容器的简单应用  

2017-07-24 18:50:13|  分类: IOC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
转自: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 plain copy
  1. /// <summary>  
  2. /// 鸟类接口  
  3. /// </summary>  
  4. public interface IBird  
  5. {  
  6.     /// <summary>  
  7.     /// 讲话  
  8.     /// </summary>  
  9.     void Say( );  
  10. }  

对这个接口进行实现:

[csharp] view plain copy
  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 plain copy
  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 plain copy
  1. public class Sparrow : IBird  
  2. {  
  3.     public void Say()  
  4.     {  
  5.         Console.WriteLine("麻雀在叫....");  
  6.     }  
  7. }  

Main方法代码:

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


运行结果依然是:



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


生命不息,编程不止!

  评论这张
 
阅读(26)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017