図2に示すように、容器手書きユニティ - 第一層の依存性注入

異なる、 - 「ユニティコンテナの極端なシンプルなバージョン手書きユニティ・コンテナ」とのシーン建設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(); 
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/menglin2010/p/12080179.html