(转)[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity?
2010-11-01 13:33
786 查看
原文地址:http://www.cnblogs.com/kyo-yo/archive/2010/11/01/Learning-EntLib-Ninth-Decoupling-Your-System-Using-The-Unity-PART1-Why-Use-Unity.html
今天继续微软企业库5.0的学习之路,今天将介绍微软企业库的重要模块——Unity。
本篇文章将主要介绍:
1、Unity模块的相关基本知识。
2、为什么要使用Unity?
3、在什么情况下需要使用Unity。
4、Unity学习资源推荐
今天继续微软企业库5.0的学习之路,今天将介绍微软企业库的重要模块——Unity。
本篇文章将主要介绍:
2、为什么要使用Unity?
3、在什么情况下需要使用Unity。
4、Unity学习资源推荐
一、Unity模块的相关基本知识
在企业库4.0版本中,
在介绍完了Unity的由来后,我们还要需要2个知识IOC(InversionofControl)和DI(DependencyInjection):
1、IOC(InversionofControl)——反转控制,根据其字面意思我们就可以知道就是将控制权反转出去。
在我们以往开发代码的过程中每一层都紧紧地联系在一起,一层依赖一层,如果一层发生了变化那就会导致其他层也发生连锁反应,例如:业务逻辑层(BLL)依赖于数据访问层(DAL),一般都是直接创建数据访问层相应的对象,如:
1 | public class UserManage |
2 | { |
3 | UserServiceserivce= new UserService(); |
4 | public void Insert(Useruser) |
5 | { |
6 | service.Insert(user); |
7 | } |
8 | } |
IOC的出现正是为了解决这种问题,使用过工厂模式的朋友一定会知道,我们可以通过特定配置或者约定来根据具体的情况来反射加载或创建所需的对象实例,而IOC可以说就是工厂模式的升级版本,IOC接管了这些复杂的层与层、接口与类或者类与类之间的映射关系,我们在编写代码的时候无需考虑我到底需要什么,只要告诉IOC我要什么,IOC会根据我们所配置或约定好的来提供我们所需要的对象。
Unity就是这样一个优秀的、轻量级的IOC容器,我们可以通过代码或者XML配置文件来配置对象与对象之间的关系,在运行时直接调用Unity容器既可获取我们所需的对象。
2、DI(DependencyInjection),依赖注入,从字面上可以看出,其意思就是根据依赖关系进行注入。
依赖注入分为:构造函数注入、属性注入和方法注入。
对于一个类对象来说,主要暴露给其它对象的3个成员就是构造函数、属性和方法,在这3类成员中都可以存在于依赖其他类或接口参数。例如:
01 | public class A |
02 | { |
03 | public A(Bb) |
04 | { |
05 | this .B=b; |
06 | } |
07 |
08 | public BB{ get ; set ;} |
09 |
10 | public void Test(Bb) |
11 | { |
12 | Console.WriteLine(b.ToString()); |
13 | } |
14 | } |
总的来说,DI是实现IOC的方式,IOC的思想是解除对象与对象之间的依赖,由IOC来进行控制,而DI则是IOC思想的具体实现。
[b]二、为什么要使用Unity?[/b]
在.NET平台下已经有了许多优秀的IOC容器,比如:Spring.NET,
但是作为p&p小组推出的轻量级的IOC容器,自从随EntLib4.0发布Unity1.0后一直维护到现在的2.0,Unity已经很完善了,并且已经被许多开发者所使用,并发挥着重要的作用,其中最主要项目当属p&p小组自身所开发的EnterperiseLibrary。
同时在
2、Unity支持必要的抽象,其允许开发者在运行时或配置去指定依赖关系同时可以简单的管理横切点(AOP)。
3、Unity增加了推迟到容器组件配置的灵活性。其同样支持一个容器层次的结构。
4、Unity拥有服务定位能力,对于一个程序在许多情况下重复使用组件来分离和集中功能是非常有用的。5、Unity允许客户端储存或缓存容器。对于在ASP.NETWebapplications中开发者将容器持久化于ASP.NET中的session或application中特别有效。6、Unity拥有拦截能力,其允许开发者通过创建并执行handlers(在方法或属性被调用到达之前)来为已存在的组件增加一个函数,并再次为返回调用结果。7、Unity可以从标准配置系统中读取配置信息,例如:XML文件,同时使用配置文件来配置容器。8、Unity支持开发者实现自定义容器扩展,例如:你可以实现方法来允许额外的对象构造和容器特征,例如缓存。9、Unity允许架构师和开发者在现代化的程序中更简单的实现通用设计模式。
[b]三、在什么情况下需要使用Unity[/b]
有关在什么情况下需要使用Unity这一点,在官方文档中的
2、构建的对象和类需要依赖其他对象或类。
3、依赖于复杂的或需要抽象的对象。
4、希望利用构造函数、方法或属性的调用注入优势。
5、希望管理对象实例的生命周期。
6、希望能够在运行时管理并改变依赖关系。
7、希望在拦截方法或属性调用的时候生成一个策略链或管道处理容器来实现横切(AOP)任务。
8、希望在WebApplication中的回发操作时能够缓存或持久化依赖关系。
2、依赖项过于简单或者不需要抽象。
[b]四、Unity学习资源推荐[/b]
Unity从08年正式发布到现在,已经有许多优秀的学习资源,以下是我认为比较好的学习资源:
1、
2、
3、
4、
以上就是本文的所有内容了,本文主要是根据Unity的官方文档以及一些个人的理解整理而成,如果有不正确的地方欢迎大家指出。
[b]微软企业库5.0学习之路系列文章索引:[/b]