私たちは「のような依存性注入:制御の反転」述べたように、多くの人々は、IOCは、オブジェクト指向は必ずしもリンクされていないと、実際にIoCのはだけでなく、それも自分自身ではない、「オブジェクト指向のデザインパターン」の一種として理解されますこれは、デザインパターンです。一般的には、デザインパターンはいくつかの特定の問題への解決策を提供していますが、どちらのIoC自体は可能な解決策を提供していない対象問題領域を、ので、私たちはIoCをより傾斜しています設計原理として。IoCの原則を採用しているデザインパターンに慣れている私たちの多くの背後に、我々はいくつかの典型的な導入する必要があり、「デザインモードを。」
テンプレートメソッド
IOCは多くの人が最初に考えたが、依存性注入ですが、私の意見でのIoCとほとんど接触が密接に他が「と呼ばれている触れた、言及したテンプレートメソッド(テンプレート法、)」デザインパターン。テンプレートパターンの方法は、ワークフローテンプレートの方法またはアルゴリズムに多重化される請求モデルは、単一ステッププロセスまたはアルゴリズムの組成物は、それぞれに実装され、複数のステップを定義することのIoC意図を一致させると言うことができます仮想メソッドの中で、テンプレートメソッドは、事前にプログラムされたプロセスに基づいて、これらの仮想メソッドを呼び出します。これらのメソッドは、クラス、派生クラスで定義されており、我々は、プロセスの目的を達成するための仮想メソッドカスタマイズされた方法を書き換えることができます。
例えば、我々は、MVCの前で、私たちはMvcEngineクラスに実装全体の処理の流れを要求することができ、この実証しました。次のコードは、我々は、5つの保護された仮想メソッドが定義されているアクティベーションを行う、リクエストの受信を監視し、コントローラビューを標的、提示、テンプレートは、事前定義されたプロセスフローに従ってStartAsyncメソッド呼び出し要求を有していますこれらの5つの方法。
パブリック クラスMvcEngine { パブリック 非同期タスクStartAsync(URIアドレス) { 待つListenAsync(アドレス)。 ながら(真) { VARの要求=を待つ)(ReceiveAsyncします。 VaRのコントローラ= 待つCreateControllerAsync(要求)。 VaRのビュー=を待つExecuteControllerAsync(コントローラ)。 待つRenderViewAsync(図)。 } } 保護された 仮想タスクListenAsync(URIアドレス)。 保護された 仮想タスク<要求> ReceiveAsync(); 保護された 仮想タスク<コントローラ> CreateControllerAsync(要求リクエスト)。 保護された 仮想タスク<表示> ExecuteControllerAsync(コントローラコントローラ); 保護された 仮想タスクRenderViewAsync(ビュービュー)。 }
完全に遵守のための要求を処理するにMvcEngineで定義されている場合、特定のアプリケーションでは、それだけでMvcEngineオブジェクトを作成し、リスナーのアドレスは、MVCエンジンがすることができ開くStartAsyncテンプレートメソッドを呼び出して指定する必要があります。MVCエンジンの一部が要件を満たしていない要求を処理した場合、我々はMvcEngine派生クラスを作成し、適切なリンクを達成するための仮想メソッドをオーバーライドすることができます。たとえば、アプリケーション内のコントローラの定義はステートレスで、それはそれは次のようにカスタムを作成することができ、パフォーマンスを向上させるためにコントローラの再利用オブジェクトをアクティブ化されたシングルトン(シングルトン)を経由して欲しいですFoobarMvcEngineと書き換えCreateControllerAsync方法は、独自の方法ですることができます。
パブリック クラスFoobarMvcEngine:MvcEngine { 保護 オーバーライドタスク<表示> CreateControllerAsync(要求リクエスト) { <<省略实现>> } }
第二に、ファクトリメソッド
複雑なプロセスのために、我々はそれをカスタマイズプロセスの形で対応するコンポーネントを提供することによって達成することができ、対応する構成要素に実装プロセスのあらゆる側面を構成している傾向にあります。私たちは、23個のデザインパターンが重要なタイプを持っている間、つまり、そのようなIoCのもこれらの設計によって具現化することが仕立てのプロセスと共有一般的に使用される「ファクトリメソッド」と「抽象工場」として、「スキーマを作成する」ことを知っていますモードが完了します。
このメソッドは純粋仮想メソッドすることができ、それは仮想メソッドのデフォルトの実装であってもよいし、白が必要なサービスオブジェクトを提供するためのクラス定義された方法であることを言って、いわゆるファクトリメソッド、。戻り型の宣言は、インタフェースまたは抽象クラスとすることができるように、それがブロックされていない(密閉)特定のタイプであることができます。その派生型として、又はファクトリメソッドを書き換えるには、必要なサービスオブジェクトを提供するために実装することができます。
私たちのMVCフレームワークと同じことが、例えば、我々は全体の要求処理フローの中核部分を完了するために、いくつかの別々の部品を作ります。具体的には、これらのコア・コンポーネントに対応する次のいくつかのインタフェースを定義します。IWebListenerインターフェースは、モニタ受信し、(要求に完全に応答するための方法ReceiveAsyncのHttpContextコンテキストによって返された)要求に応答するために使用され、IControllerActivator現在のコンテキストのアクティブ化ターゲットのHttpContextコントローラオブジェクトのインターフェース、及びに従って行わ一部復旧作業のリリース後にコントローラオブジェクトを行います。IControllerExecutorとIViewRenderとしての表示のためのコントローラとプレゼンテーションのためのインタフェースの実装を完了するために使用されました。
パブリック インターフェースIWebListener { タスクListenAsync(URIアドレス)。 タスク <のHttpContext> ReceiveAsync(); } パブリック インターフェイスIControllerActivator { タスク <コントローラ> CreateControllerAsync(のHttpContextのHttpContext)。 タスクReleaseAsync(コントローラー・コントローラ)。 } パブリック インターフェイスIControllerExecutor { タスク <表示> ExecuteAsync(コントローラー・コントローラ、のHttpContextのHttpContext)。 } パブリック インターフェイスIViewRender { タスクRendAsync(ビュービューのHttpContextのHttpContext)。 }
MVCエンジンは、これらの四つの成分を送達するように、我々はMvcEngine 4つのファクトリメソッド(GetWebListener、GetControllerActivator、GetControllerExecutorとGetViewRenderer)を定義しました。4つのファクトリメソッドは、デフォルトの実装を持って、我々は、デフォルトのコンポーネントを提供するためにそれらを使用できる仮想メソッドです。エンジンを始動させるためStartAsync方法では、我々は完全に要求されたプロセスを提供し、特定のファクトリメソッドにこれらのオブジェクトを使用します。
パブリック クラスMvcEngine { パブリック 非同期タスクStartAsync(URIアドレス) { VARのリスナー= GetWebListener()。 VaRの活性化因子= GetControllerActivator(); VaRのエグゼキュータ= GetControllerExecutor()。 VAR =レンダリング)(GetViewRenderを。 待つlistener.ListenAsync(アドレス)。 一方、(真) { VARのHttpContext = 待つlistener.ReceiveAsync()。 VARのコントローラは= 待ちますactivator.CreateControllerAsync(のHttpContext)。 試す { VARのビュー=を待つ(コントローラのHttpContext)executor.ExecuteAsyncと、 待つrender.RendAsync(ビュー、のHttpContext)。 } 最後に { 待つactivator.ReleaseAsync(コントローラ)。 } } } 保護された 仮想)(IWebLister GetWebListenerします。 保護された 仮想IControllerActivator GetControllerActivator(); 保護された 仮想IControllerExecutor GetControllerExecutor(); 保護されました 仮想IViewRender GetViewRender(); }
一方の部分は、要求処理をカスタマイズする必要がある場合、特定の用途のために、それはインタフェースの動作に対応するカスタム実装クラスに実装する必要があります。MvcEngine派生クラスでは、我々は、対応するオブジェクトをカスタマイズすることができます提供するために、ファクトリメソッドをオーバーライドする必要があります。例えば、上記実施形態のシングルモードを提供することを目的として、コントローラオブジェクトはSingletonControllerActivatorクラスで定義され、我々はSingletonControllerActivatorオブジェクトを返すためにFoobarMvcEngine MvcEngine GetControllerActivatorクラスを書き換えるファクトリメソッドを導出しました。
パブリック クラスSingletonControllerActivator:IControllerActivator { パブリックタスク<コントローラ> CreateControllerAsync(のHttpContextのHttpContext) { <<省略实现>> } パブリックタスクReleaseAsync(コントローラー・コントローラ)=> Task.CompletedTask。 } パブリック クラスFoobarMvcEngine:MvcEngine { 保護 オーバーライド ControllerActivator GetControllerActivator()=> 新しいSingletonControllerActivator()。 }
第三に、抽象工場
ファクトリメソッドと抽象的な工場は「生産」ファクトリオブジェクトのインスタンスを提供していますが、自然の設計の両方の異なるがありますが。ファクトリメソッド「は、完全なまたは仮想メソッドの抽象メソッドで定義された型を使用して、単一のオブジェクトを提供すること」、及び別のインタフェースを使用して、抽象ファクトリは、抽象クラスであるか、または提供するために、「関連するオブジェクトのグループ。」
具体的には、別の工場インターフェースや抽象ファクトリクラスを定義し、「提供するために複数のファクトリメソッドを定義する必要があり、同じ家族の関連オブジェクトの数のを」。「出力」のデフォルトセットを有する所望の抽象工場場合は、戻り値としてデフォルトのオブジェクトの仮想メソッドの形で定義された抽象工場、ファクトリメソッドとして密閉型にすることはできません。特定のアプリケーション開発では、我々は(抽象クラスに限らない)、具体的なファクトリクラスを定義し、オブジェクトのシリーズのカスタマイズされたセットを提供するためにそれを使用する方法を工場出荷時のインタフェースを実現するか、抽象ファクトリクラスを継承することができます。
今、私たちは私たちのMVCフレームワークを変換するAbstract Factoryパターンを使用します。次のコードは、我々はIMvcEngineFactory抽象ファクトリと呼ばれるインタフェースを定義し、4つのコアオブジェクトを使用するリスニング要求を提供し、処理するための4つのメソッドを定義します。MVCのための4つのコアコンポーネントのデフォルトの実装を提供している場合は、我々は次のように抽象工場のためのデフォルトの実装(MvcEngineFactory)を提供することができます。
パブリック インターフェースIMvcEngineFactory { IWebLister GetWebListener()。 IControllerActivator GetControllerActivator()。 IControllerExecutor GetControllerExecutor()。 IViewRender GetViewRender()。 } パブリック クラスMvcEngineFactory:IMvcEngineFactory { パブリック 仮想IWebLister GetWebListener()。 パブリック 仮想IControllerActivator GetControllerActivator(); パブリック 仮想IControllerExecutor GetControllerExecutor(); パブリック 仮想IViewRender GetViewRender(); }
今、私たちは私たちのMVCフレームワークを変換するAbstract Factoryパターンを使用します。私たちは、MvcEngineオブジェクトを作成するときに、明示的に指定しない場合、デフォルトのMvcEngineがEngineFactoryオブジェクトを使用する特定のIMvcEngineFactoryのオブジェクトを提供します。エンジンを始動させるためStartAsync方法において、MvcEngineは、要求プロセスフローに対応するオブジェクトを取得するためにIMvcEngineFactoryオブジェクトを使用します。
パブリック クラスMvcEngine { 公共 IMvcEngineFactory EngineFactory { 取得します。} 公共 MvcEngine(IMvcEngineFactory engineFactory = NULL)=> EngineFactory = engineFactory?新しいMvcEngineFactory(); パブリック 非同期タスクStartAsync(URIアドレス) { VARのリスナー= EngineFactory.GetWebListener()。 VaRの活性化因子= EngineFactory.GetControllerActivator(); VaRのエグゼキュータ= EngineFactory.GetControllerExecutor()。 VAR =レンダリング)(EngineFactory.GetViewRenderを。 待つlistener.ListenAsync(アドレス)。 一方、(真) { VARのHttpContext = 待つlistener.ReceiveAsync()。 VaRのコントローラ= 待つactivator.CreateControllerAsyncを(のHttpContext)。 試す { VARのビュー=を待つ(コントローラのHttpContext)executor.ExecuteAsyncと、 待つrender.RendAsync(ビュー、のHttpContext)。 } 最後に { 待つactivator.ReleaseAsync(コントローラ)。 } } } }
特定のアプリケーションは、以前に定義された単一SingletonControllerActivatorの実施形態の使用を必要とする場合、ターゲットオブジェクトにコントローラを活性化し、以下の方法に従った特定のクラスFoobarEngineFactoryファクトリを定義することができます。することができ、最終的なアプリケーションは、FoobarEngineFactoryエンジンMvcEngineオブジェクトを作成するには、このオブジェクトを使用します。
パブリック クラスFoobarEngineFactory:EngineFactory { 公共 オーバーライドControllerActivator GetControllerActivator() { 戻り 新しい)(SingletonControllerActivatorします。 } } パブリック クラスアプリ { 静的 非同期タスクのmain() { VARのアドレス= 新しいウリ(" http://0.0.0.0:8080/mvcapp " )。 VaRのエンジン= 新しい MvcEngine(新FoobarEngineFactory()); 待つengine.StartAsync(アドレス)。 ... } }
[ASP.NETコア3フレーム開示]依存性注入:制御の反転
[ASP.NETコア3フレーム開示]依存性注入:IoCのモード
[ASP.NETコア3フレーム開示]依存性注入:依存性注入モード
[ASP.NETコア3フレームワークシークレット]の依存性注入:DIフレームワークのミニバージョン