您的位置:首页 > 移动开发 > Unity3D

Unity IOC容器的简单应用

2018-01-07 20:08 399 查看
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;
}


运行结果依然是:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: