異なる、 - 「ユニティコンテナの極端なシンプルなバージョン手書きユニティ・コンテナ」とのシーン建設AndroidPhone時間、AndroidPhoneがiPadで依存しています
1、IPhoneインタフェース
名前空間SimplestUnity_OneLayer { インタフェースIPhone { 無効コール(); } }
2、AndroidPhoneを達成
名前空間SimplestUnity_OneLayer { パブリック クラスAndroidPhone:IPhone { パブリックAndroidPhone() { Console.WriteLineを(" {0}构造函数"、この.GetType()の名前。); } } }
3、アプリのインターフェイス
名前空間SimplestUnity_OneLayer { パブリック インターフェイスのiPad { 無効ショー(); } }
4、iPadが実現します
名前空間SimplestUnity_OneLayer { パブリック クラスAndroidPad:子供パッド { パブリックAndroidPad() { Console.WriteLineを(" {0}构造函数"、この.GetType()の名前。); } 公共 ボイドショー() { Console.WriteLineを(" 看{0} "、この.GetType()の名前。); } } }
5、コンテナ - インターフェイス
パブリック インターフェースIDavidContainer { ボイド RegisterType <TFrom、TTO> (); Tの解決 <T> (); }
6、コンテナ - 実現
名前空間SimplestUnity_OneLayer { /// <要約> /// 容器-工厂 /// </要約> パブリック クラスDaivdContainer:IDaivdContainer { プライベート辞書< 文字列、タイプ> containerDictionary = 新しい辞書< 文字列、タイプ>(); // 字典 /// <要約> /// 注册类型 /// </要約> /// <typeparam名= "TFrom"> </ typeparam> /// <typeparam名= "TTO"> </ typeparam > 公共 のボイド RegisterType < ContainerDictionary.Add(typeof演算(TFrom).FullName、typeof演算(TTO)); } /// <まとめ> /// 取得例 /// </要約> /// <typeParam名= "T"> </ typeParam> /// <戻り値> </戻り> パブリック Tの解決<T> () { 式タイプ = containerDictionary [ typeof演算(T).FullName]; // 1は、すべてのコンストラクタの種類を与える ConstructorInfo [] = ctorArrayのタイプ.GetConstructors()。 // 2、唯一のコンストラクタはマークを取得するDavidInjectionConstructor特性は、機能がマークされていない場合は、パラメータのコンストラクタを取得します = CurrentCtor ConstructorInfoのNULL ; IF(ctorArray.Count(C => c.IsDefined(typeof演算(DavidInjectionConstructor)、真の))> 0 ) { currentCtor = ctorArray.FirstOrDefault(C => c.IsDefined(typeof演算(DavidInjectionConstructor)、trueに) ); // 第一の特徴マークDavidInjectionConstructorコンストラクタ取得 } 他の { currentCtor = ctorArray.OrderByDescending(C => c.GetParameters()長).FirstOrDefault();. // パラメータコンストラクタの最も数を取得 } リスト < オブジェクト > = paraList 新しい新しいリスト< オブジェクト > (); foreachの(VARのパラでcurrentCtor.GetParameters()) { // パラメータタイプがインスタンス作成しない、アプリ抽象得られる VAR ParaType = para.ParameterType; // これに応じてipadとキー、AndroidPadタイプ、特定の種類を取得するインスタンスを作成することができ VAR targetParaType = containerDictionary [paraType.FullName]; paraList.Add(Activator.CreateInstance(targetParaType)); } リターン(T)Activator.CreateInstance(タイプ、paraList.ToArray( )); } } }
7、コール
名前空間SimplestUnity_OneLayer { クラスプログラム { 静的な 無効メイン(文字列[] argsを) { DaivdContainer davidContainer = 新しいDaivdContainer(); davidContainer.RegisterType <IPhone、AndroidPhone> (); davidContainer.RegisterType <アプリ、AndroidPad> (); IPhoneのiPhone = davidContainer.Resolve <IPhone> (); iphone.Call(); } } }