Unity具体实现依赖注入包含、属性注入、方法注入。
构造函数注入
public void ConStructorCodeTest1() { //默认注册(无命名),如果后面还有默认注册会覆盖前面的 container.RegisterType<IClass, CbClass>(); IClass cb = container.Resolve<IClass>(); cb.ClassName = "武术 2008级"; container.RegisterType<IStudent, QlinStudent>(new InjectionConstructor(cb,"jay.star")); IStudent splitClass = container.Resolve<IStudent>(); //splitClass.Name = "James"; txtResult.Text = splitClass.ShowInfo(); } /// <summary> /// 班级接口 /// </summary> public interface IClass { string ClassName { get; set; } string ShowInfo(); } /// <summary> /// 计科班 /// </summary> public class CbClass : IClass { public string ClassName { get; set; } public string ShowInfo() { return string.Format("班级名称:{0}", ClassName); } } /// <summary> /// 电商班 /// </summary> public class EcClass : IClass { public string ClassName { get; set; } public string ShowInfo() { return string.Format("班级名称:{0}", ClassName); } } /// <summary> /// 学生接口 /// </summary> public interface IStudent { string Name { get; set; } //就读班级 string ShowInfo(); } /// <summary> /// 学生 /// </summary> public class QlinStudent : IStudent { public string Name { get; set; } private IClass ToClass { get; set; } public QlinStudent(IClass _class, string name) { Name = name; ToClass = _class; } public string ShowInfo() { return string.Format("{0} 就读班级:{1}", Name, ToClass.ClassName); } }
指定构造函数
如果构造函数有多个,它也会按照上面那样来初始化一个对象,我们还可以显示用InjectionConstructor特性来指定一个构造函数来解析对象,如下声明:
[InjectionConstructor] public QlinStudent(IClass _class,string name) { ToClass = _class; Name = name; }
指定参数依赖的注册名称
构造函数中IClass参数,如果IUnityContainer注册了多个,默认是使用无名称的那个注册,也可以通过Dependency依赖哪个名称来指定哪个来注册,代码,指定ec名称如下:
[InjectionConstructor] public QlinStudent([Dependency("ec")]IClass _class) { ToClass = _class; }
下面注册一个名称为ec的映射,如果没有名称ec的映射将报错
public void ConStructorCodeTest1() { //默认注册(无命名),如果后面还有默认注册会覆盖前面的 container.RegisterType<IClass, CbClass>(); //命名注册 //container.RegisterType<IClass, EcClass>();//此句将报错 container.RegisterType<IClass, EcClass>("ec"); container.RegisterType<IStudent, QlinStudent>(); //解析默认对象 IStudent splitClass = container.Resolve<IStudent>(); txtResult.Text = splitClass.ShowInfo(); }
指定参数值
构造器中的参数也可以依赖一个指定的类型值,如下代码依赖于EcClass类型,可以让构造函数中可以传入一个具体的类型,这也是构造函数传参数,如下:
public static void ConStructorCodeTest1() { IUnityContainer container = new UnityContainer(); //默认注册(无命名),如果后面还有默认注册会覆盖前面的 container.RegisterType<IClass, CbClass>(); //命名注册 container.RegisterType<IClass, EcClass>("ec"); container.RegisterType<IStudent, QlinStudent>(new InjectionConstructor(new CbClass())); IStudent splitClass = container.Resolve<IStudent>(); splitClass.ShowInfo(); }
来源:http://www.cnblogs.com/qqlin/archive/2012/10/18/2720828.html