依赖注入模块Unity 简介(转)
微软企业库4.1学习笔记(四十一)依赖注入模块Unity 简介模块Unity是一个轻量的、可扩展的依赖注入容器,支持构造函数注入、属性注入、方法调用注入。你可以用它创建企业库对象,也可以创建自定义的业务对象。Unity和企业库中的其他模块有一些不同点:
本节包含下面的内容
1 简介 模块Unity是一个轻量的、可扩展的依赖注入容器,支持构造函数注入、属性注入、方法调用注入。它为开发者提供了下面的好处:
包含下面的一些话题,通过这些话题,你可以看看Unity模块是否适合于你。
1.1 常用解决方案 Unity模块解决了一些开发者在基于组建开发的过程中遇到的问题。现代的商业应用,为了满足特殊的需求,都包含有自定义的业务对象和自定义的组件。组件还可能独立的实现横跨日志、验证、授权、缓存和异常处理的需求。 成功构建这种类型应用的关键是完成一个解耦的、松散耦合的设计。松散耦合的应用更灵活、更容易维护。而且在开发的过程中更容易测试。你可以在测试的过程中伪造一些具有强依赖的对象,来辅助测试。例如:数据库连接、网络连接、ERP连接、富UI组件。 依赖注入是构建松散耦合应用的首选技术。它提供了处理对象之间的依赖关系的方法。例如:一个处理客户信息的对象,可能会依赖于数据访问对象,验证信息的对象,检查用户是否被授权用户。依赖注入技术可以保证客户类被正确的初始化,并且加载上面所需的对象,尤其是当依赖于抽象的时候。 下面的模式都是用来架构和简化这个开发过程的;
Unity模块的使用步骤:
1.2 示例代码 使用依赖注入框架和反转控制技术,开发者可以创建程序集中的自定义类的实例和依赖对象的实例。Unity支持这个功能,使得开发者可以容器配置注入、构造函数注入、属性注入、方法调用注入技术创建对象和依赖对象的实例。 Unity提供了两个方法了来注册类型和映射他们的关系:
容器配置注册类型
using
System;
System.Collections.Generic; System.Linq; System.Web; Microsoft.Practices.Unity; namespace BeautyCode.Web.Unity { public interface IMyService {} class CustomService:IMyService {} UnityDemo { UnityDemo() { IUnityContainerucontainer = new UnityContainer(); ucontainer.RegisterType < IMyService,CustomService > (); IMyServicemyService ucontainer.Resolve IMyService (); } } }
容器配置注册一个已经存在的对象实例
LogService:IMyService
{} void UnityDemo1() { IUnityContaineruContainer UnityContainer(); LogServicemyExistingObject LogService(); uContainer.RegisterInstance (myExistingObject); IMyServicemyServiceInstance uContainer.Resolve (); } } }
构造函数注入 如果开发者使用Unity容器的Resolve方法实例化的一个类,这个类包含一个构造函数,构造函数对另外的一个对象有依赖。Unity容器会自动创建构造函数以来的对象。
CustomService:IMyService
{ CustomService(LogServicelog) { log.WriteLog( " loginfo " ); } } LogService:IMyService { WriteLog( string logMsg) {} } (); ucontainer.RegisterType (); CustomServicemyService CustomService
在运行的时候,开发者通过Resolve方法创建了一个CustomService类的实例,导致容器自动创建一个LogService对象,对象的范围是CustomService范围内。 属性注入 除了使用构造函数注入,Unity还支持属性注入和方法调用注入。下面的代码演示了属性注入。
public
class
SupplierData
{ string Name{ get ; set ;} } ProductService { private SupplierData_supplier; [Dependency] SupplierDataSupplier { { return _supplier;} {_supplier = value;} } }
这时候创建一个ProductService类的实例,会自动创建一个SupplierData实例,作为ProductService实例的属性SupplierData的值。 1.3 设计亮点 Unity模块具有下面的功能:
1.4什么时候选用Unity模块
依赖注入提供了简化代码、抽象对象之间的依赖、自动创建依赖对象的实例等机会。但是,过程还是会对性能有一点影响,在简化依赖的基础上还是增加了一点复杂性。 通常情况下,你可以在下面的情形中使用Unity模块:
在下面的情况,就不需要使用Unity模块了:
Unity 容器使用顺序图
转自:http://www.cnblogs.com/DoNetCShap/archive/2011/12/21/2295521.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |