[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity?

      今天继续微软企业库5.0的学习之路,今天将介绍微软企业库的重要模块——Unity。

本篇文章将主要介绍:

1、Unity模块的相关基本知识。

2、为什么要使用Unity?

3、在什么情况下需要使用Unity。

4、Unity学习资源推荐

 

一、Unity模块的相关基本知识

在企业库4.0版本中,patterns & practices小组对整个企业库的架构进行了重大变更,将原来的核心依赖注入框架——ObjectBuilder整合进入了Untiy中,在原来Unity1.0还未推出时,整个企业库乃至p&p的许多其他项目都依赖于ObjectBuilder,但是由于ObjectBuilder过于复杂、没有详细的规范的文档且其中集成了许多其他项目的功能,导致了学习的复杂性,所以p&p就推出了自己的依赖注入容器——Unity,并且将ObjectBuilder整合进其中,这样既可顺利接管原来的依赖注入方式,同时也可以完成对企业库对象的创建,有关Unity的一些相关信息可以查看这篇文章——扩展学习篇、库中的依赖关系注入(重构 Microsoft Enterprise Library)[转]

在介绍完了Unity的由来后,我们还要需要2个知识IOCInversion of Control )和DIDependency Injection):

1、IOCInversion of Control )——反转控制,根据其字面意思我们就可以知道就是将控制权反转出去。

在我们以往开发代码的过程中每一层都紧紧地联系在一起,一层依赖一层,如果一层发生了变化那就会导致其他层也发生连锁反应,例如:业务逻辑层(BLL)依赖于数据访问层(DAL),一般都是直接创建数据访问层相应的对象,如:

public class UserManage
{
	UserService serivce = new UserService();
	public void Insert(User user)
	{
		service.Insert(user);
	}
}

可以看出,以上的代码中,业务逻辑层直接通过实例化的方式来进行对数据访问层的操作,乍看之下没什么问题,但是当项目达到一定的规模,同时业务逻辑发生变更时(如将依赖于其他的数据访问层或者特殊的数据访问层时),这些代码都是一个个隐藏的炸弹,一旦爆炸起来会有让你重写代码的冲动。

IOC的出现正是为了解决这种问题,使用过工厂模式的朋友一定会知道,我们可以通过特定配置或者约定来根据具体的情况来反射加载或创建所需的对象实例,而IOC可以说就是工厂模式的升级版本,IOC接管了这些复杂的层与层、接口与类或者类与类之间的映射关系,我们在编写代码的时候无需考虑我到底需要什么,只要告诉IOC我要什么,IOC会根据我们所配置或约定好的来提供我们所需要的对象。

Unity就是这样一个优秀的、轻量级的IOC容器,我们可以通过代码或者XML配置文件来配置对象与对象之间的关系,在运行时直接调用Unity容器既可获取我们所需的对象。

2、DIDependency Injection),依赖注入,从字面上可以看出,其意思就是根据依赖关系进行注入。

依赖注入分为:构造函数注入、属性注入和方法注入。

对于一个类对象来说,主要暴露给其它对象的3个成员就是构造函数、属性和方法,在这3类成员中都可以存在于依赖其他类或接口参数。例如:

public class A
{
    public A(B b)
    {
        this.B = b;
    }

    public B B { get; set; }

    public void Test(B b)
    {
        Console.WriteLine(b.ToString());
    }
}

可以看到上面的代码中,在A类中的构造函数、属性以及方法中都有对B类对象的依赖,在一般情况下,如果想实例化A类,则必须传递B对象,但是如果B对象为NULL,那在接下来的代码中如果直接对属性B进行操作则会出现异常,同理,如果在调用方法Test,传递一个为NULL值的B对象,一样会引发异常,而我们的常规做法则是在调用前事先构建好一个B对象,然后传递进去,但是这样做的话就会导致代码重复,这时就体现出了DI的重要性了,我们可以通过IOC来对这些依赖进行创建,这样就无需我们在调用前还要想好先对调用的对象依赖进行创建,仅仅只需要事先配置好映射,大大的方便了我们日常的开发。

总的来说,DI是实现IOC的方式,IOC的思想是解除对象与对象之间的依赖,由IOC来进行控制,而DI则是IOC思想的具体实现。

 

二、为什么要使用Unity?

在.NET平台下已经有了许多优秀的IOC容器,比如:Spring.NET,

但是作为p&p小组推出的轻量级的IOC容器,自从随EntLib4.0发布Unity1.0后一直维护到现在的2.0,Unity已经很完善了,并且已经被许多开发者所使用,并发挥着重要的作用,其中最主要项目当属p&p小组自身所开发的Enterperise Library。

同时在When Should I Use Unity?中还例举了许多Unity的优势,或者说也是使用Unity的理由,以下是我翻译的(肯定存在着翻译错误,英文好的可以直接查看原文):

1、Unity支持简单对象创建,特别是分层对象结构和依赖,以简化程序代码。其包含一个编译那些可能存在依赖于其他对象的对象实例机制。

2、Unity支持必要的抽象,其允许开发者在运行时或配置去指定依赖关系同时可以简单的管理横切点(AOP)。

  • 3、Unity增加了推迟到容器组件配置的灵活性。其同样支持一个容器层次的结构。
  • 4、Unity拥有服务定位能力,对于一个程序在许多情况下重复使用组件来分离和集中功能是非常有用的。
    • 5、Unity允许客户端储存或缓存容器。对于在ASP.NET Web applications中开发者将容器持久化于ASP.NET中的session或application中特别有效。
      • 6、Unity拥有拦截能力,其允许开发者通过创建并执行handlers(在方法或属性被调用到达之前)来为已存在的组件增加一个函数,并再次为返回调用结果。
        • 7、Unity可以从标准配置系统中读取配置信息,例如:XML文件,同时使用配置文件来配置容器。
          • 8、Unity支持开发者实现自定义容器扩展,例如:你可以实现方法来允许额外的对象构造和容器特征,例如缓存。
            • 9、Unity允许架构师和开发者在现代化的程序中更简单的实现通用设计模式。

同时你还可以查看——[翻译]What Does Unity do?——Unity可以做什么?更详细的来了解Unity能做什么。

 

三、在什么情况下需要使用Unity

有关在什么情况下需要使用Unity这一点,在官方文档中的When Should I Use Unity?中已经有了比较详细且比较标准的说法了,以下是我翻译的(肯定存在着翻译错误,英文好的可以直接查看原文):

  • 1、所构建的系统依赖于健全的面向对象原则,但是大量不同的代码交织在一起而难以维护。
  • 2、构建的对象和类需要依赖其他对象或类。
  • 3、依赖于复杂的或需要抽象的对象。
  • 4、希望利用构造函数、方法或属性的调用注入优势。
  • 5、希望管理对象实例的生命周期。
  • 6、希望能够在运行时管理并改变依赖关系。
  • 7、希望在拦截方法或属性调用的时候生成一个策略链或管道处理容器来实现横切(AOP)任务。
  • 8、希望在Web Application中的回发操作时能够缓存或持久化依赖关系。

同时在文档中还指出了什么情况下不需要使用Unity,我认为也是比较重要的:

1、所编写的对象或类不依赖于其他对象或类。

2、依赖项过于简单或者不需要抽象。

当然对于大多数的企业级开发还是建议使用Unity来接管对象的创建与依赖关系,这样可以保证系统良好的耦合。

 

四、Unity学习资源推荐

Unity从08年正式发布到现在,已经有许多优秀的学习资源,以下是我认为比较好的学习资源:

1、Unity2.0官方文档(相对来说还可以直接下载EntLib50-combined这份文档,里面包含了企业库所有模块的介绍以及API)

2、Hands-On Labs for Microsoft Enterprise Library 5.0(EntLib的官方示例,里面包括了EntLib的各模块的功能示例,同样包含了Unity2.0)

3、Unity2.0源代码

4、Artech所写的有关Unity的文章

 

以上就是本文的所有内容了,本文主要是根据Unity的官方文档以及一些个人的理解整理而成,如果有不正确的地方欢迎大家指出。

 

微软企业库5.0 学习之路系列文章索引:

第一步、基本入门

第二步、使用VS2010+Data Access模块建立多数据库项目

第三步、为项目加上异常处理(采用自定义扩展方式记录到数据库中)

第四步、使用缓存提高网站的性能(EntLib Caching)

第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇

第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——中篇

第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——下篇

第六步、使用Validation模块进行服务器端数据验证

第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—上篇

第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—下篇

第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息

第九步、使用PolicyInjection模块进行AOP—PART1——基本使用介绍

第九步、使用PolicyInjection模块进行AOP—PART2——自定义Matching Rule

第九步、使用PolicyInjection模块进行AOP—PART3——内置Call Handler介绍

第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录

第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity?

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(2)

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(3)

第十步、使用Unity解耦你的系统—PART3——依赖注入

扩展学习:

扩展学习篇、库中的依赖关系注入(重构 Microsoft Enterprise Library)[转]

posted @ 2010-11-01 09:44 kyo-yo 阅读(...) 评论(...) 编辑 收藏