转自: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文件;

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

  1. /// <summary>
  2. /// 鸟类接口
  3. /// </summary>
  4. public interface IBird
  5. {
  6. /// <summary>
  7. /// 讲话
  8. /// </summary>
  9. void Say( );
  10. }

对这个接口进行实现:

  1. /// <summary>
  2. /// 燕子
  3. /// </summary>
  4. public class Swallow : IBird
  5. {
  6. public void Say( )
  7. {
  8. Console.WriteLine("燕子在叫...");
  9. }
  10. }

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

  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. bird.Say();
  9. Console.Read();

运行结果:

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

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

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

  1. public class Sparrow : IBird
  2. {
  3. public void Say()
  4. {
  5. Console.WriteLine("麻雀在叫....");
  6. }
  7. }

Main方法代码:

  1. //实例化一个控制器
  2. IUnityContainer unityContainer = new UnityContainer();
  3. //实现注入
  4. unityContainer.RegisterType<IBird, Swallow>();
  5. unityContainer.RegisterType<IBird, Sparrow>();
  6. IBird bird = unityContainer.Resolve<IBird>();
  7. bird.Say();
  8. Console.Read();

运行一下,结果:

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

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

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

  1. //实例化一个控制器
  2. IUnityContainer unityContainer = new UnityContainer();
  3. //实现注入,用别名区分实现
  4. unityContainer.RegisterType<IBird, Swallow>("Swallow");
  5. unityContainer.RegisterType<IBird, Sparrow>("Sparrow");
  6. IBird swallow = unityContainer.Resolve<IBird>("Swallow");
  7. IBird sparrow = unityContainer.Resolve<IBird>("Sparrow");
  8. swallow.Say();
  9. sparrow.Say();
  10. Console.Read();

运行结果:

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

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

(二) Unity的构造函数注入

 

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

  1. /// <summary>
  2. /// 小鸟的家
  3. /// </summary>
  4. public interface IBirdHome
  5. {
  6. IBird Swallow { get; set; }
  7. }
  8. /// <summary>
  9. /// 小鸟的家
  10. /// </summary>
  11. public class BirdHome : IBirdHome
  12. {
  13. public IBird Swallow { get; set; }
  14. public BirdHome(IBird bird)
  15. {
  16. this.Swallow = bird;
  17. }
  18. }

main方法如下:

  1. //实例化一个控制器
  2. IUnityContainer unityContainer = new UnityContainer();
  3. //实现注入
  4. unityContainer.RegisterType<IBird, Swallow>();
  5. unityContainer.RegisterType<IBirdHome, BirdHome>();
  6. IBirdHome birdHome = unityContainer.Resolve<IBirdHome>();
  7. birdHome.Swallow.Say();
  8. Console.Read();

运行结果:

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

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

(三)属性注入

 

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

  1. /// <summary>
  2. /// 小鸟的家
  3. /// </summary>
  4. public class BirdHome : IBirdHome
  5. {
  6. /// <summary>
  7. /// 属性注入
  8. /// </summary>
  9. [Dependency]
  10. public IBird Swallow { get; set; }
  11. }

运行结果与上结果一样,亲,不信,试试!

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

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

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

运行结果依然是:

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

生命不息,编程不止!

Unity IOC容器的简单应用(转)的更多相关文章

  1. 总结Unity IOC容器通过配置实现类型映射的几种基本使用方法

    网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new Un ...

  2. Unity IOC容器通过配置实现类型映射的几种基本使用方法

    网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下 unityContainer = new Uni ...

  3. 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...

  4. Unity IOC容器的构造函数使用笔记(不能错过的Unity示例)

    示例一,正常使用: 相关定义: public interface ICar { int Run(); } public class BMW : ICar { ; public int Run() { ...

  5. 几句代码简单实现IoC容器

    前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成 ...

  6. Castle IOC容器快速入门

    主要内容 1.为什么要IOC 2.什么是Castle IOC容器 3.快速入门示例 4.几个重要的概念 一,为什么要IOC IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已 ...

  7. spring-framework-中文文档一:IoC容器、介绍Spring IoC容器和bean

    5. IoC容器 5.1介绍Spring IoC容器和bean 5.2容器概述 本章介绍Spring Framework实现控制反转(IoC)[1]原理.IoC也被称为依赖注入(DI).它是一个过程, ...

  8. Spring.net(二)----初探IOC容器

    我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口.  IObjectFactory接口和 ...

  9. IoC容器简介

    官网说明: 在核心的第7章节 1 Spring IoC 容器和 beans 简介 本章介绍了 Spring Framework implementation of the Inversion of C ...

随机推荐

  1. centos如何卸载软件

    需要看你的软件包格式: 如果你带有yum,可以直接yum remove xxx如果是rpm包,rpm -e xxxtar包的话需要你直接删除该文件或者make uninstall xxx常见的就这三种

  2. Angularjs学习笔记(四)----与后端服务器通信

    一.使用$http进行XHR和JSONP请求 1.1 XHR请求 GET:$http.get(url,config) POST:$http.post(url,data,config) PUT:$htt ...

  3. limux curl命令

    linux curl命令很强大: http://blog.chinaunix.net/uid-14735472-id-3413867.html curl是一种命令行工具,作用是发出网络请求,然后得到和 ...

  4. div显示提示信息

    div显示提示信息 <body> <style type="text/css"> a.link{position:relative;} a.link div ...

  5. CURLcode curl_easy_setopt(原创)

    中文翻译: curl_easy_setopt() libcurl 手册 curl_easy_setopt() 名称 curl_easy_setopt -curl的设置选项 概要 #include &l ...

  6. centos文件误删除恢复

    Centos 文件误删除 当意识到误删除文件后,切忌千万不要再频繁写入了,否则 你的数据恢复的数量将会很少. 而我们要做的是,第一时间把服务器上的服务全部停掉,直接killall 进程名 或者 kil ...

  7. JavaWeb 学习009-4个页面,5条sql语句(添加、查看、修改、删除)

    ===========++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==+++++++++ 2016-12-3------ ...

  8. jQuery Mobile 表单输入元素

    jQuery Mobile 文本输入 输入字段是通过标准的 HTML 元素编写的,jQuery Mobile 会为它们设置专门针对移动设备的美观易用的样式.您还可以使用新的 HTML5 <inp ...

  9. css3新特性@media(媒体查询)

    现在web页面运行的设备的屏幕从pc端到pad,从pad到手机,各种各样,这样就用到了现在经常用到的响应式页面,为实现响应式页面开发,就用到一个非常有用的css3属性media(媒体查询). 介绍:媒 ...

  10. linux 下进程通讯详解

    linux 下进程通讯方法主要有以下六种: 1.管道 2.信号 3.共享内存 4.消息队列 5.信号量 6.socket