ConStructorConfigTest1()
{
IUnityContainer container =
string configFile =
http://www.cnblogs.com/UnityDemo/Constructor/Unity.config;
var fileMap =
new ExeConfigurationFileMap { ExeConfigFilename =
configFile };
从config文件中读取配置信息
Configuration configuration =
ConfigurationManager.OpenMappedExeConfiguration(fileMap,ConfigurationUserLevel.None);
获取指定名称的配置节
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(
unity);
载入名称为FirstClass 的container节点
container.LoadConfiguration(section,
FirstClass);
IStudent splitClass = container.Resolve<IStudent>
?
2.2 指定构造函数
如果构造函数有多个,它也会按照上面那样来初始化一个对象,我们还可以显示用InjectionConstructor特性来指定一个构造函数来解析对象,如下声明:

private ; }
QlinStudent()
{
}
[InjectionConstructor]
public QlinStudent(IClass _class,string name)
{
ToClass = _class;
Name = name;
}
2.3 指定参数依赖的注册名称
构造函数中IClass参数,如果IUnityContainer注册了多个,默认是使用无名称的那个注册,也可以通过Dependency依赖哪个名称来指定哪个来注册,代码,指定ec名称如下:
[InjectionConstructor]
public QlinStudent([Dependency(ec)]IClass _class)
{
ToClass = _class;
}
下面注册一个名称为ec的映射,如果没有名称ec的映射将报错
UnityContainer();
命名注册
container.RegisterType<IClass,EcClass>(
);
container.RegisterType<IStudent,0); line-height:1.5!important">();
配置文件方式,代码不变,配置中添加一个 name属性就行,如下:
2.4 指定参数值
构造器中的参数也可以依赖一个指定的类型值,如下代码依赖于EcClass类型,可以让构造函数中可以传入一个具体的类型,这也是构造函数传参数,如下:
new InjectionConstructor(
CbClass()));
IStudent splitClass = container.Resolve<IStudent>
或者注册一个实例对象,如下:
UnityContainer();
IClass cbClass =
new CbClass { ClassName=
计科051班 };
实例注册命名实例
container.RegisterInstance<IClass>(
();
IStudent splitClass = container.Resolve<IStudent>
?
配置文件也可以指定类型依赖,如下,指定EcClass:

>
constructor>
param ="_class"="IClass">
dependency />
param 上面已经介绍了传参数,是用InjectionConstructor类型,现在构造函数,多一个参数,如下:
")]IClass _class,0); line-height:1.5!important"> name;
}
多了一个name参数,那必须为容器IUnityContainer提供这个参数,没有这个原材料,它无法构造,就会报错,如下代码:
UnityContainer();
container.RegisterType<IStudent,255); line-height:1.5!important">new CbClass() { ClassName =
计科051" },0); line-height:1.5!important">Qlin
));
IStudent splitClass = container.Resolve<IStudent>
();
splitClass.ShowInfo();
}

注入参数后,也可以下次解析的时候,通过ParameterOverrides类来覆盖原来的参数,改变参数值,如下:
UnityContainer();
container.RegisterType<IStudent,0); line-height:1.5!important">));
IStudent student = container.Resolve<IStudent>
();
student.ShowInfo();
覆盖参数解析
IStudent student1 = container.Resolve<IStudent>(
ParameterOverrides()
{
{_class",255); line-height:1.5!important">new EcClass(){ ClassName=
电商051}},{namelinq}
});
student1.ShowInfo();
}

?
3.属性注入
就是Unity容器解析对象时,为属性赋值,有操作权限要Public修饰属性。属性注入方式和构造函数注入类似,只需在需要注入的属性上增加一个 Dependency特性,Dependency指定一个注册名称name参数用来指定注入对象的名称,属性注入也是伴随着类型初始化时注入的,在解析时 自动注入,所以解析时跟以前一样。代码修改如下,在ToClass属性上增加了Dependency特性,来表示这个属性需要注入:
; }
[Dependency(
)]
public IClass ToClass {
代码方式如下:
IUnityContainer container = UnityContainer();
container.RegisterType<IClass,0); line-height:1.5!important">);
container.RegisterType<IStudent,0); line-height:1.5!important">();
splitClass.ShowInfo();
配置文件方式,依赖的<dependency?name="ec1"?name值 可指定注册时注册的名称:
="ConsoleApplication1.UnityDemo.Constructor4"
>
="ec1"property ="ClassName" propertyType="System.String" value="电商051" />
="ToClass"dependency />
property 调用效果图:

4.方法注入
用public修饰方法,方法注入也是跟构造函数类似代码修改如下
; }
[InjectionMethod]
InitClass(IClass _class)
{
ToClass =
编程方式注入不变,就是初始化时,注入值,如下:
();
container.RegisterType<IStudent,0); line-height:1.5!important">();
IStudent student = container.Resolve<IStudent>();
student.ShowInfo();
配置文件方式:
="ConsoleApplication1.UnityDemo.Constructor5" ="Name"="Qlin" method ="InitClass"method 5.小结
?介绍了3种依赖注入方式,平时主要也就用到这么几种,其它还有复杂的像扩展容器等,通过本节,基本知道Unity的使用了。
http://www.cnblogs.com/pengdajian/archive/2013/02/22/2921881.html
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!