Unity具体实现依赖注入包含、属性注入、方法注入。
构造函数注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 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特性来指定一个构造函数来解析对象,如下声明:
1 2 3 4 5 6 | [InjectionConstructor] public QlinStudent(IClass _class, string name) { ToClass = _class; Name = name; } |
指定参数依赖的注册名称
构造函数中IClass参数,如果IUnityContainer注册了多个,默认是使用无名称的那个注册,也可以通过Dependency依赖哪个名称来指定哪个来注册,代码,指定ec名称如下:
1 2 3 4 5 | [InjectionConstructor] public QlinStudent([Dependency( "ec" )]IClass _class) { ToClass = _class; } |
下面注册一个名称为ec的映射,如果没有名称ec的映射将报错
1 2 3 4 5 6 7 8 9 10 11 12 | 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类型,可以让构造函数中可以传入一个具体的类型,这也是构造函数传参数,如下:
1 2 3 4 5 6 7 8 9 10 11 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】