2、手写Unity容器--第一层依赖注入
程序员文章站
2024-02-07 11:11:10
这个场景跟《手写Unity容器--极致简陋版Unity容器》不同,这里构造AndroidPhone的时候,AndroidPhone依赖于1个IPad 1、IPhone接口 2、AndroidPhone实现 3、IPad接口 4、IPad实现 5、容器--接口 6、容器--实现 7、调用 ......
这个场景跟《手写unity容器--极致简陋版unity容器》不同,这里构造androidphone的时候,androidphone依赖于1个ipad
1、iphone接口
namespace simplestunity_onelayer { interface iphone { void call(); } }
2、androidphone实现
namespace simplestunity_onelayer { public class androidphone : iphone { public androidphone() { console.writeline("{0}构造函数", this.gettype().name); } } }
3、ipad接口
namespace simplestunity_onelayer { public interface ipad { void show(); } }
4、ipad实现
namespace simplestunity_onelayer { public class androidpad:ipad { public androidpad() { console.writeline("{0}构造函数", this.gettype().name); } public void show() { console.writeline("看{0}", this.gettype().name); } } }
5、容器--接口
public interface idavidcontainer { void registertype<tfrom, tto>(); t resolve<t>(); }
6、容器--实现
namespace simplestunity_onelayer { /// <summary> /// 容器--工厂 /// </summary> public class daivdcontainer:idaivdcontainer { private dictionary<string, type> containerdictionary = new dictionary<string, type>();//字典 /// <summary> /// 注册类型 /// </summary> /// <typeparam name="tfrom"></typeparam> /// <typeparam name="tto"></typeparam> public void registertype<tfrom, tto>() { containerdictionary.add(typeof(tfrom).fullname, typeof(tto)); } /// <summary> /// 获取实例 /// </summary> /// <typeparam name="t"></typeparam> /// <returns></returns> public t resolve<t>() { type type = containerdictionary[typeof(t).fullname]; //1、得到类型的所有构造函数 constructorinfo[] ctorarray = type.getconstructors(); //2、只得到有标记davidinjectionconstructor特性的构造函数,如果都没有标记特性,那么得到参数最多的构造函数 constructorinfo currentctor = null; if (ctorarray.count(c => c.isdefined(typeof(davidinjectionconstructor), true)) > 0) { currentctor = ctorarray.firstordefault(c => c.isdefined(typeof(davidinjectionconstructor), true));//得到第1个标记davidinjectionconstructor特性的构造函数 } else { currentctor = ctorarray.orderbydescending(c => c.getparameters().length).firstordefault();//得到参数个数最多的构造函数 } list<object> paralist = new list<object>(); foreach (var para in currentctor.getparameters()) { //得到的参数类型是ipad,抽象无法创建实例 var paratype = para.parametertype; //所以根据ipad key,得到androidpad类型,具体类型就可以创建实例 var targetparatype = containerdictionary[paratype.fullname]; paralist.add(activator.createinstance(targetparatype)); } return (t)activator.createinstance(type,paralist.toarray()); } } }
7、调用
namespace simplestunity_onelayer { class program { static void main(string[] args) { daivdcontainer davidcontainer = new daivdcontainer(); davidcontainer.registertype<iphone, androidphone>(); davidcontainer.registertype<ipad, androidpad>(); iphone iphone = davidcontainer.resolve<iphone>(); iphone.call(); } } }