你是J2EE方面的开发人员的话,这个学习手册对你没有用;如果你对于.NET的认识只是基于拖放的方式或是基于事件的话,那么这个技术对于你来说太难以理解了;如果你对于新技术很热爱并且有相当的框架的概念或是你本身就是一个J2EE的开发工程师并且想了解.NET下的东西的话,或者你是一个想从事一个大系统的规划站在巨人肩膀上的话,那么你需要来看看这篇手册,来帮助你最快的掌握Microsoft Enterprise Library 4.1的一个核心模块 Unity。
不用找了,中国没有任何一本关于这个技术的书籍(新技术到了中国起码要过个1年半载)……更何况翻译的水平超级的垃圾(我英语再烂,也宁可看原版)
首先来介绍一个技术“依赖注入”,对于从事JAVA工作的人来说,第一个能够想到的便是Spring这个框架。正式由于这项技术的引入,使得一个功能模块能得到灵活的组装和替换,更能够让框架来维护生成对象的生命周期。因此来为这个词语定义——依赖注入主要用于构建松耦合的应用,他提供了控制对象之间相互依赖关系的方法,并且控制着对象的生命周期。另外还要介绍3种在该平台内使用的设计模式:Inversion of Control (IoC) pattern——反向控制; Dependency Injection (DI)——依赖注入; Interception pattern——拦截器。
和Spring一样(当然有一个.NET下的Spring版本),使用配置文件来描述类和类之间的依赖关系,类型等。所有的这些关系和类型都存在于容器内,Unity不会自动读取配置文件信息或是创建和准备容器,因此必须在代码内初始话容器。在配置文件中的容器定义是平级别的,但是可以在代码中将一个容器设置为另外一个容器的子容器。
运行期内可以通过代码来进行构造、属性、方法的注入
Unity配置节点
typeAliases
类型别名的集合,这些别名可以在容器的mappings,lifetimes, instantces,extensions中使用,但是不能对于typeConfig中使用别名。
typeAlias
类型别名项,为类型定义了一个别名并且可以在配置文件的其他部分内使用。有以下属性。
例子:
containers
Unity容器的集合,只包含容器这个节点。
container
只包含一个属性name
types
包含所有映射到container中注册的类型集合,包含了一系列独立的类型以及如何注入。
type
定义了类型在container内的映射,并且可以为每个类型定义生命周期(lifetime),如果没有定义的话,系统将使用临时的生命周期管理。并且这个是Unity的核心部分。
具有以下属性
lifetime
指定type映射对象的生命周期管理器。具有以下属性
typeConfig
所有对于构造注入、属性注入、方法注入都是在这个元素内进行定义。
constructor
构造注入的描述,在每个typeConfig中最多只能有一个构造注入。
param
定义和描述构造注入或是方法注入时使用的参数。注意的是genericParameterName的值如果设置了一个名字,那么表示了这个参数使用泛型进行定义,那么就不能在描述parameterType或是propertyType。
value
存在于parameter和property内的一个元素,可以是.net平台内的一个默认的类型(String或是Integer),也可以使用自定义的类型转换器来对type属性内的类型进行转换和描述。
dependency
描述在parameter或是property的依赖关系。需要注意以下几点:
1. 如果在param和property中已经定义了value,那么就不能再定义dependency
2. 如果在param和property中对于genericParameterName做了定义,那么dependency就不能有type属性
属性见下
array
是包含需要解析的类型参数的注册实例的数组。可以包含以下元素:array,dependency,value。
以下的一个例子描述了构造注入的配置:
property
用于描述属性注入需要的对象类型。
1. 当定义了propertyType之后,只能包含最多一个子元素或是不包换元素
2. property可以包含一个value,或是一个dependency,或是一个array元素
3. 当定义了泛型参数名genericParameterName,那么propertyType就不能定义
4. 当有定义了泛型参数名例如"T",那么可以包含一个<dependency />子元素也可以不包换,当泛型参数名为"T[]”,那么必须定义一个<array />子元素,并且自元素内不能再包换任何别的元素。
属性注入的例子:
method
描述方法注入的对象类型
例如:
以上定义对应于代码
instances
所有对象实例的集合,由于很多对象包换太多的字段,如果在字符串内容中进行定义内容的话,需要指定typeConvert,才可以进行,否则,只能定义一些.net支持的基本类型。当然也可以在代码中直接使用container.RegisterInstance来把实例注册在容器内。
add元素可以有以下属性
extensions
可以直接注册在容器内的插件集合。
add元素只有一个属性就是type,type可以是在typeAliases中定义的一个类型的别名,也可以是一个真正的类。
extensionConfig
描述了如何在配置文件中解析extension配置的类集合。add有2个属性,一个是名称,一个是类型,类型可以是在typeAliases中定义的一个类型别名,也可以是一个真正的类。
interceptors
包含所有的拦截器的集合。
interceptor
拦截器有key, default2个子元素,属性如下
其他还有很多元素,将在用到的时候在说明例如<matchRule><policy>