Unity IOC容器的简单应用

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

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

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

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

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

5.实例和类型拦截

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

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

以下程序用的是2.1版本

下面开始Unity之旅

(一) 我的第一个Unity Demo

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

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

    /// <summary>  
    /// 鸟类接口  
    /// </summary>  
    public interface IBird  
    {  
        /// <summary>  
        /// 讲话  
        /// </summary>  
        void Say( );  
    }  

对这个接口进行实现:

    /// <summary>  
    /// 燕子  
    /// </summary>  
    public class Swallow : IBird  
    {  
        public void Say( )  
        {  
            Console.WriteLine("燕子在叫...");  
        }  
    }  

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

    static void Main( string[] args )  
    {  
               //实例化一个控制器  
               IUnityContainer unityContainer = new UnityContainer();  
               //实现注入  
               unityContainer.RegisterType<IBird, Swallow>();  
               IBird bird = unityContainer.Resolve<IBird>();  

               bird.Say();  

               Console.Read();  
   }

运行结果:
这里写图片描述

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

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

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

    public class Sparrow : IBird  
    {  
        public void Say()  
        {  
            Console.WriteLine("麻雀在叫....");  
        }  
    }  

Main方法代码:

//实例化一个控制器  
IUnityContainer unityContainer = new UnityContainer();  
//实现注入  
unityContainer.RegisterType<IBird, Swallow>();  
unityContainer.RegisterType<IBird, Sparrow>();  

IBird bird = unityContainer.Resolve<IBird>();  

bird.Say();  

Console.Read(); 

运行一下,结果:
这里写图片描述

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

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

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

    //实例化一个控制器  
    IUnityContainer unityContainer = new UnityContainer();  
    //实现注入,用别名区分实现  
    unityContainer.RegisterType<IBird, Swallow>("Swallow");  
    unityContainer.RegisterType<IBird, Sparrow>("Sparrow");  

    IBird swallow = unityContainer.Resolve<IBird>("Swallow");  
    IBird sparrow = unityContainer.Resolve<IBird>("Sparrow");  

    swallow.Say();  
    sparrow.Say();  

    Console.Read();  

运行结果:
这里写图片描述

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

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

(二) Unity的构造函数注入

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

    /// <summary>  
    /// 小鸟的家  
    /// </summary>  
    public interface IBirdHome  
    {  
        IBird Swallow { get; set; }  
    }  

    /// <summary>  
    /// 小鸟的家  
    /// </summary>  
    public class BirdHome : IBirdHome  
    {  
        public IBird Swallow { get; set; }  

        public BirdHome(IBird bird)  
        {  
            this.Swallow = bird;  
        }  
    }  

main方法如下:

    //实例化一个控制器  
    IUnityContainer unityContainer = new UnityContainer();  
    //实现注入  
    unityContainer.RegisterType<IBird, Swallow>();  
    unityContainer.RegisterType<IBirdHome, BirdHome>();  

    IBirdHome birdHome = unityContainer.Resolve<IBirdHome>();  
    birdHome.Swallow.Say();  

    Console.Read();  

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

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

(三)属性注入

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

    /// <summary>  
    /// 小鸟的家  
    /// </summary>  
    public class BirdHome : IBirdHome  
    {  
        /// <summary>  
        /// 属性注入  
        /// </summary>  
        [Dependency]  
        public IBird Swallow { get; set; }  
    }  

运行结果与上结果一样

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

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

        /// <summary>  
        /// 初始化器注入  
        /// </summary>  
        /// <param name="bird"></param>  
       [InjectionMethod]  
        public void Initialize(IBird bird)  
        {  
            this.Swallow = bird;  
        }  

运行结果依然是:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值