C# IoC 容器
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文件;
新建一个鸟类的接口,定义一个鸟叫的方法;
- /// <summary>
- /// 鸟类接口
- /// </summary>
- public interface IBird
- {
- /// <summary>
- /// 讲话
- /// </summary>
- void Say( );
- }
对这个接口进行实现:
- /// <summary>
- /// 燕子
- /// </summary>
- public class Swallow : IBird
- {
- public void Say( )
- {
- Console.WriteLine("燕子在叫...");
- }
- }
在Mian方法中通过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;
- }
运行结果依然是:
欢迎大家前来拍砖........!
C# IoC 容器的更多相关文章
- 深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
- IL实现简单的IOC容器
既然了解了IL的接口和动态类之间的知识,何不使用进来项目实验一下呢?而第一反应就是想到了平时经常说的IOC容器,在园子里搜索了一下也有这类型的文章http://www.cnblogs.com/kkll ...
- 通过中看不中用的代码分析Ioc容器,依赖注入....
/** * 通过生产拥有超能力的超人实例 来理解IOC容器 */ //超能力模组接口 interface SuperModuleInterface{ public function activate( ...
- Spring在非web应用中关闭IoC容器 (registerShutdownHook)
在基于web的ApplicationContext实现中,已有相应的实现来处理关闭web应用时恰当地关闭Spring IoC容器.但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如 ...
- .net自带的IOC容器MEF使用
IOC能做什么 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序. 控制反转: 将控制权移交给第三方容器 new 操作 依赖注入: 在程序 ...
- NET 自带IOC容器MEF指初体验
转自:http://www.cnblogs.com/ulex/p/4186881.html IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动 ...
- 自定义模拟一个Spring IOC容器
一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...
- Spring框架IOC容器和AOP解析
主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置 一.S ...
- Lind.DDD.IoC(大叔推荐)~在服务定位器中引入IoC容器~容器的适配器
回到目录 关于依赖倒置(DIP) 高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口,通俗的讲,就是高层模块定义接口,低层模块负责实现,这在我们实际开发中经常被用到,层与层之间引用,经 ...
随机推荐
- 坑爹的vector iterators incompatible错误(VS中属性页-->C/C++-->代码生成-->>运行库)
之前一直被这个错误折磨着,就是不知道问题在那,后来找了很多资料,大概都是说这是因为多个线程同时操作vector的问题(参考这里).可是我这里的代码并没有问题,因为同样的代码在别的解决方案中已经成功运行 ...
- 服务 Service 基本介绍
Activity public class MainActivity extends ListActivity { private boolean flag;//是否开启线程 publ ...
- 通知 Notification 详解
效果 通知栏-刚收到通知时 通知栏-收到通知几秒后 标准视图 大视图-下滑前是标准视图 大视图-下滑后显示大视图 自定义通知 讲解 Notification,俗称通知,是一种具有全局效果的通知,它展示 ...
- Linux命令之用户与组管理
介绍 Linux操作系统中,任何文件都归属某一特定的用户,而任何用户都隶属至少一个用户组.用户是否有权限对某文件进行访问.读写以及执行,受到系统严格约束的正式这种清晰.严谨的用户与用户组管理系统.在很 ...
- Web应用程序项目XXXX已配置为使用IIS。无法访问IIS元数据库。您没有足够的特权访问计算机上的IIS网站
问题:Windows8下直接使用VS打开项目,出现问题:XXXX已配置为使用IIS.无法访问IIS元数据库.您没有足够的特权访问计算机上的IIS网站.解决:1.以“管理员权限”运行VS,在VS菜单打开 ...
- HTML5画布(阴影)
案例1: <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8& ...
- Vim的snipMate插件
介绍终于发现了一个插件,对于Vim下代码块的自动补全支持的很好.给大家推荐snipMate. snipMate可以帮助您在vim上实现类似Textmate的功能,自动代码块的能力非常强大,而且代码块是 ...
- virtual pc中添加软盘支持
最近对操作系统挺有兴趣的,实验了一下!准备找一个虚拟机,之前在xp上使用virtual pc感觉不错,准备在本机上装一下,但是发现居然不支持软盘了! 查阅了各种资料,终于找到了解决的办法. 1. 下载 ...
- Repeater绑定数据库,使用AspNetPager进行分页
分页是Web中经常遇到的功能,分页主要有真分页和假分页. 所谓真分页是指:每一页显示多少数据,就从数据库读多少数据: 假分页是指:一次性从数据库读取所有数据,然后再进行分页. 这两种分页方式区别在于从 ...
- canvas加载图像
之前按照例子,加载图像,发现加载图像,加载不上去,代码也没有错误,经过几次的尝试:发现需要重复调用下drawImage才可以. <script type="text/javascrip ...