ASP.NET MVCの依存性注入

自動注入機能は、コードをより単純かつ春に柔軟ジャワ行うので、C#の、実装プロセスのステップの分析によって、次のステップに移植でそれを取ります

1.自動注入シーン解析

asp.netのMVCでは、関係なく、どのようなコードの論理階層、コントローラ層のための最終的なプレゼンテーション層であるので、我々注入点は、我々は、コードマークが行いを注入する必要がスキャンし、デフォルトのターゲット・ControllerFactoryを交換する必要がコントローラでありますインプラントの例

 パブリック クラスFastControllerFactory:DefaultControllerFactory 
    { 
        公共 オーバーライド IController CreateController(RequestContextのRequestContextの、ストリングコントローラ名)
        { 
            タイプtype = この.GetControllerType(RequestContextの、コントローラ名)。
            オブジェクトOBJ = GetControllerInstance(RequestContextの、タイプ); 

            // コントローラの中标记AutoWired属性的自动注入 
            一覧<のFieldInfo> AutoWiredFieldList = type.GetRuntimeFields()ここで、(F => f.GetCustomAttribute(typeof演算(AutoWired))!= nullの).ToList();
            foreachの(のFieldInfoフィールドAutoWiredFieldList)
            { 
                field.SetValue(OBJ、InjectUtil.Container.Resolve(field.FieldType))。
            } 
            戻り OBJ としてIController。
        } 
    }

FastControllerFactoryは、当社のカスタムコントローラーの工場で、AutoWiredこの引数定義された注釈、ビーンコンテナの割り当てから取った例をマーキングするCreateControllerメソッドをオーバーライドし、我々はまた、デフォルトを作り、グローバルなファイルにStartメソッドを必要とします植物の交換

ControllerBuilder.Current.SetControllerFactory(新しい FastControllerFactory());

2.IOCコンテナを達成

C#のカスタム・コンテナは、軽量バージョンである私たちが実現を所有するなどAutoFac、成熟オープンソースのフレームワークをたくさん持っています

送信元アドレス:https://gitee.com/grassprogramming/FastIOC

、マークがコンポーネントと呼ばれ、マークを噴射する必要があり、我々はBeanオブジェクトに必要なすべての最初の、私たちはasp.netのMVCを使用する方法について、ここで焦点となってみよう

Startメソッドのasp.net MVCグローバルなファイルでは、我々は自動的に容器ビーンに注入するプロジェクト全体を必要とします

    パブリック クラスInjectUtil 
    { 
        パブリック 静的ContainerBuilderコンテナ。
        パブリック 静的 ボイドは、init()
        { 
            コンテナ = 新しいContainerBuilder()。
             // 获取所有程序集
            のvar。アセンブリ=のSystem.Web.Compilation.BuildManager.GetReferencedAssembliesは()キャスト<組立> ().ToArray();
            // 注入所有コンポーネント组件 
            Container.RegisterAssemblyTypes(アセンブリ、typeof演算(成分)、)。
            Container.Build(); 
        } 
    }

 

ここではコントローラーレベルの事項には完了している、あなたはさらに処理IOCコンテナBeanインスタンスメソッドを初期化する必要があります

       プライベートオブジェクトでGetInstance(RegisterEntityエンティティ)
        { 
            オブジェクトOBJ = NULL ;
            もし(Entity.IsEnableIntercept)
            { 
                BOOL IsExtend = Entity.RealType == Entity.RegistType。
                OBJ = DynamictProxy.CreateProxyObject(Entity.RealType、Entity.RegistType、Entity.InterceptType、IsExtend、Entity.IsInterceptAllMethod)。


            } 
            
            { 
                VARのコンストラクタ=のEntity.RegistType.GetConstructors()。
                OBJ =コンストラクタ[ 0 ] .Invoke(オブジェクト[] {}); 
            } 
            // 本明細書で使用される、実施形態インスタンスメモリの単一のインスタンス、露出されたオブジェクトインスタンスは、後続の設けられていない前進
            IF(!)SingleInstanceDic.ContainsKey(Entity.RealType)
            { 
                SingleInstanceDic.Add(Entity.RealTypeを、OBJ); 
            } 
        
            // このクラスはコンポーネントを標識し、マークされたフィールドAutoWired、自動注射がある場合
            IF(Entity.RealType.GetCustomAttribute(typeof演算(成分)、trueに)!= NULL 
            { 
                // ここでの使用がGetRuntimeFields、この方法は、継承された非公開、及び静的フィールドの例を含む指定されたタイプで定義されているすべてのフィールドを返します。
                foreachの(フィールド、のFieldInfo Entity.RealType.GetRuntimeFields())
                {
                    IF(Field.GetCustomAttribute(typeof演算(Autowired)、trueに)!= NULL 
                    { 
                        タイプFIELDTYPE = Field.FieldType;
                         IF (格納し(FIELDTYPE))
                        { 
                            // もしあれば、撮影した割り当てを、単一インスタンスのストレージを含めるかどうかを判断します円形の依存性による無限ループを防止することができる
                            IF (SingleInstanceDic.ContainsKey(FIELDTYPE))
                            { 
                                Field.SetValue(OBJ、SingleInstanceDic [FIELDTYPE]); 
                            } 
                            そう 
                            {
                                Field.SetValue(OBJ、(FIELDTYPE)を解決)。
                            } 
                           
                        } 
                    } 
                } 
            } 
            戻りOBJ。

        }

 

でGetInstance Beanオブジェクトは、メソッドのコアは非常に単純でインスタンス化することで注意すべき2つの点があり、そのうちの反射を介してオブジェクトを作成することです

フィールドを注入する必要がなくなるまで1)内部のネストされたオブジェクトの依存性注入がある場合、可変ビーンビーン初期のすべての時間をスキャンする必要、再帰を使用することが必要です

2)私は、ここで使用される再帰的にスキャンした場合、Bクラスのテスト中に依存性注入は、クラスBの依存性の注入、作成の従来のプロセスが実行されてもよいように、シングルモードの実施形態であるだろう対象が循環参照を避けるために、注入される再度スキャン直接使用取られている場合、メモリのループ、オーバーフローに、単一の対象の実施形態の使用は、それが、辞書に作成されています

3.その他

他のに使用されていないコントローラのクラスは、直接使用IOC豆から容器を除去する必要がある、注射依拠します

 プライベート AuthUtil @AuthUtil = InjectUtil.Container.Resolve <AuthUtil>();

すべての分析で、ここで機能が完了し、最後の戦いの広告は、急速な発展のために、独自のASP.NET MVCフレームワークを作成し、我々は波をサポートしたいです

住所:https://gitee.com/grassprogramming/FastExecutor

おすすめ

転載: www.cnblogs.com/yanpeng19940119/p/11502385.html
おすすめ