一、构造函数注入
1、指定生成构造函数
当一个类有多个构造函数,想要生成指定的构造函数,需要添加如下代码:
public QlinStudent() { } [InjectionConstructor]//指定生成这个带参的构造函数 public QlinStudent(IClass _class,string name) { ToClass = _class; Name = name; }
2、指定参数依赖的注册名称
如果IClass 注册多个类型时,用默认(无名)注册就容易被覆盖,但也可以通过Dependency依赖哪个名称来指定哪个来注册。
[InjectionConstructor]//指定生成构造函数 //[Dependency("ec")]指定注册名称ec public QlinStudent([Dependency("ec")]IClass _class) { ToClass = _class; }
最好给每一个注册添加唯一的名字,下面注册一个名称为ec的映射,如果没有名称ec的映射将报错。
IUnityContainer container = new UnityContainer(); //默认注册(无命名),如果后面还有默认注册,就会覆盖前面的默认注册 container.RegisterType<IClass, CbClass>(); //命名注册 container.RegisterType<IClass, EcClass>("ec");
如果用配置文件,只要再添加一个name
<register type="IClass" name="ec" mapTo="EcClass"/>
3、指定参数值
构造函数中的参数,可以以类为类型。如下代码可以让构造函数中传入一个具体的类型。
container.RegisterType<IStudent, QlinStudent>(new InjectionConstructor(new CbClass()));
或者注册一个实例对象,如下:
IClass cbClass = new CbClass { ClassName="计科051班" }; //实例注册命名实例 container.RegisterInstance<IClass>("ec", cbClass);
配置文件也可以指定类型依赖,如下,指定EcClass:
<register type="IStudent" mapTo="QlinStudent"> <constructor> <param name="_class" type="IClass"> <dependency type="EcClass"/> </param> </constructor> </register>
构造函数中有两个参数时如何呢?
[InjectionConstructor] public QlinStudent([Dependency("ec")]IClass _class, string name) { ToClass = _class; Name = name; }
多一个参数name,就要为容器IUnityContainer提供这个参数,没有这个原材料,它无法构造就会报错,如下代码:
container.RegisterType<IStudent, QlinStudent>(new InjectionConstructor(new CbClass() { ClassName = "计科051" }, "Qlin"));
注入参数后,也可以下次解析的时候,通过ParameterOverrides类来覆盖原来的参数,改变参数值,如下:
//覆盖参数解析 IStudent student1 = container.Resolve<IStudent>(new ParameterOverrides(){{"_class",new EcClass(){ ClassName="电商051"}},{"name","linq"}});
二、属性注入
1、指定参数值
属性注入就是Unity容器解析对象时,为属性赋值。要求用Public修饰属性,只需要在需要注入的属性上方加上一个Dependency特性。属性注入也是伴随着类型初始化时注入的,在解析时自动注入。
代码如下,在ToClass属性上增加了Dependency特性,来表示这个属性需要注入:
//Dependency指定一个注册名称name参数用来指定注入对象的名称 [Dependency("ec")] public IClass ToClass { get; set; }
配置文件方式:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <!--引用命名空间--> <namespace name="ConsoleApplication1.UnityDemo.Constructor4" /> <!--引用程序集--> <assembly name="ConsoleApplication1" /> <!--容器--> <container name="FirstClass"> <!--映射关系--> <register type="IClass" mapTo="CbClass"> </register> <register type="IClass" name="ec1" mapTo="EcClass"> <!--设置属性名,属性类型,属性值--> <property name="ClassName" propertyType="System.String" value="电商051" /> </register> <register type="IStudent" mapTo="QlinStudent"> <property name="ToClass"> <!--可指定注册时注册的名称--> <dependency name="ec1" type="EcClass"/> </property> </register> </container> </unity>
三、方法注入
1、指定参数值
方法注入是为了给方法传递参数,与构造函数注入的代码相似:
public class QlinStudent : IStudent { public string Name { get; set; } private IClass ToClass { get; set; } [InjectionMethod]//表示该方法需要被注入 public void InitClass(IClass _class) { ToClass = _class; } public void ShowInfo() { Console.WriteLine("{0}就读班级:{1}", Name, ToClass.ClassName); } }
编程方式注入不变,就是初始化时注入值。
container.RegisterType<IStudent, QlinStudent>();
配置文件方式:
<register type="IStudent" mapTo="QlinStudent"> <property name="Name" propertyType="System.String" value="Qlin" /> <!--被注入的方法--> <method name="InitClass"> <param name="_class" type="IClass"> <!--可指定注册时注册的名称--> <dependency name="ec1" type="EcClass"/> </param> </method> </register>