Unity IOC容器的简单应用(转)
转自: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文件;
新建一个鸟类的接口,定义一个鸟叫的方法;
- /// <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;
- }
运行结果依然是:
欢迎大家前来拍砖........!
生命不息,编程不止!
Unity IOC容器的简单应用(转)的更多相关文章
- 总结Unity IOC容器通过配置实现类型映射的几种基本使用方法
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new Un ...
- Unity IOC容器通过配置实现类型映射的几种基本使用方法
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下 unityContainer = new Uni ...
- 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...
- Unity IOC容器的构造函数使用笔记(不能错过的Unity示例)
示例一,正常使用: 相关定义: public interface ICar { int Run(); } public class BMW : ICar { ; public int Run() { ...
- 几句代码简单实现IoC容器
前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成 ...
- Castle IOC容器快速入门
主要内容 1.为什么要IOC 2.什么是Castle IOC容器 3.快速入门示例 4.几个重要的概念 一,为什么要IOC IOC(控制反转或者叫依赖注入)Martin Fowler大师在他的文章中已 ...
- spring-framework-中文文档一:IoC容器、介绍Spring IoC容器和bean
5. IoC容器 5.1介绍Spring IoC容器和bean 5.2容器概述 本章介绍Spring Framework实现控制反转(IoC)[1]原理.IoC也被称为依赖注入(DI).它是一个过程, ...
- Spring.net(二)----初探IOC容器
我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口. IObjectFactory接口和 ...
- IoC容器简介
官网说明: 在核心的第7章节 1 Spring IoC 容器和 beans 简介 本章介绍了 Spring Framework implementation of the Inversion of C ...
随机推荐
- $.grep(array, callback, [invert])过滤,常用
$.grep(array, callback, [invert])过滤,常用 解释: 使用过滤函数过滤数组元素.此函数至少传递两个参数(第三个参数为true或false,对过滤函数返回值取反,个人觉得 ...
- test3
下面写几个示例:这是行内公式: \( e^{\pi i} + 1 = 0\) ,下面的是行间公式: \[ e^{\pi i} + 1 = 0. \] 另一个复杂的公式: $$J_\alpha (x) ...
- spring mvc 第一天【注解实现springmvc的基本配置】
创建pojo,添加标识类的注解@Controller,亦可添加该Handler的命名空间:设置类的@RequestMapping(value="/hr") 该类中的方法(Handl ...
- webservice 接口通过 HTTP 获取数据
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Ne ...
- Redis(二) 扩展
事务multi ... exec 之间的操作先进入等待队列,到exec时一起执行 事物的所有操作结果都是一起返回的,所以前一条指令的结果无法作为后一条指令的参数 ...
- ubuntu apt 安装
1. ./autogen.sh: libtoolize: not found sudo apt-get install aptitude sudo aptitude install libtool 2 ...
- SQL Cumulative Sum累积求和
期望结果: ID VAL CumSum 1 10 10 2 20 30 3 30 60 方法一: 使用分析函数 select id,val,sum(val) over ( or ...
- 【BZOJ3123】森林(主席树,启发式合并)
题意:一个带点权的森林,要求维护以下操作: 1.询问路径上的点权K大值 2.两点之间连边 n,m<=80000 思路:如果树的结构不发生变化只需要维护DFS序 现在因为树的结构发生变化,要将两棵 ...
- smarty 内存缓存
<?php //缓存 //定义一个该页面的缓存文件路径 $filename="../cache/mainhc.html"; //设置一个缓存时间 $time=; //判断缓存 ...
- db2 with ur
这几天查询DB2数据库,老遇到select * from XXX with ur, 好奇ur是什么作用,现在记录一下. DB2中,共有四种隔离级:RS,RR,CS,UR,DB2提供了这4种不同的保护级 ...