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之旅
新建一个鸟类的接口,定义一个鸟叫的方法;
对这个接口进行实现:
在Main方法中通过Unity实现IOC反转控制;
运行结果:
这个小实例已经实现了简单的IOC控制反转.
当一个接口有两个实现怎么办呢?是不是在加一个类似于下边的代码就行了呢? 下面试一下.
Main方法代码:
运行一下,结果:
嗯?这是什么情况,为什么是麻雀在叫..而不是燕子叫呢? 原来
当一个接口有多个实现,而且没有用别名区分时,就会选择最后一个注入的实现;
下边给每个注入都加上别名:
运行结果:
这才是我们想要的结果,哈哈…..
当一个接口有多个实现时,需要通过别名区分。
main方法如下:
我们只是通过
原来这些工作Unity已帮我们做了,我们可以偷个懒了.嘿嘿…….
运行结果与上结果一样
运行结果依然是:
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; }
运行结果依然是:
相关文章推荐
- Unity IOC容器的简单应用
- 微软IOC容器Unity简单代码示例2-配置文件方式
- 微软IOC容器Unity简单代码示例3-基于约定的自动注册机制
- 微软IOC容器Unity简单代码示例1
- spring ioc容器的学习笔记5---ApplicatonContext ioc容器的应用场景和简单设计原理解析
- 简单容器应用
- Unity算法——A*(AStar)寻路算法概要及简单应用
- [IoC容器Unity]第一回:Unity预览
- [IoC容器Unity]第三回:依赖注入
- Ioc容器应用浅析
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- Spring——Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)
- IoC 依赖注入容器 Unity
- 比Spring简单的IoC容器
- Spring IoC之高级应用--使bean感知容器
- 仿照spring-boot实现一个简单的ioc容器(一)
- php 简单ioc容器
- 实现简单的 IOC 容器
- IOC容器——Unity
- spring源码-IOC容器(一)-构建简单IOC容器