ASP.NETコアフレームワーク多くのコアオブジェクトは、そのようなアプリケーション、ミドルウェア、オブジェクト、およびASP.NETコアMVCアプリケーションビューコントローラオブジェクトと他のオブジェクトを初期化するスタートアップオブジェクトとして、注入依存性の方法によって提供されます既に登録されている消費者へのサービスの形で注入されたときに、私たちはそれらを定義することができます。以下は、いくつかのサービス注入の簡単なシナリオです。「ASP.NETコア3の枠組みの秘密」、書籍だけでなく、5%割引からこの記事の抜粋の最後の2日間は、2次元コード、または右からスキャンすることができます興味を持っているここでは、グループ購入にします。。
まず、注入型のコンストラクタの起動
2つのコア構成HostBuilderContextコンテキストオブジェクト(構成表さIConfigurationがホスト環境を表すオブジェクトIHostEnvironmentはオブジェクト)を直接消費のためのスタートアップコンストラクタに注入することができます。ASP.NETコアアプリケーションホスティング環境はIWebHostEnvironmentインタフェースで表されるので、インターフェイスIHostEnvironment IWebHostEnvironmentインタフェースは、オンになっているそれは注入することによっても可能であるIWebHostEnvironmentは、現在のベアラ・モード・オブジェクトに関連する環境情報を取得しました。
私たちは、コンストラクタスタートアップのvalidate注入に簡単な例を介しすることができます。次のコードは、私たちはスタートアップ<TSTARTUP>メソッド登録されたカスタムタイプの起動インタフェースIWebHostBuilderを呼び出します。スタートアップの種類を定義する場合、我々は、そのコンストラクタで3つのオブジェクトを注入し、デバッグアサーションが3つのだけオブジェクトも示し、NULLでない証明していない提供することを事実の一つの同じインスタンス内にあったIHostEnvironment IWebHostEnvironmentインターフェース及びコネクタの使用。
クラスプログラム { 静的な 無効メイン() { Host.CreateDefaultBuilder()ConfigureWebHostDefaults(ビルダー。 => builder.UseStartup <スタートアップ> ()) .Build() .RUN(); } } パブリック クラス起動 { 公共スタートアップ(IConfiguration構成、IHostEnvironment hostingEnvironment、IWebHostEnvironment webHostEnvironment) { Debug.Assertの(構成!= NULL ); Debug.Assertの(hostingEnvironment =!ヌル)。 Debug.Assertの(webHostEnvironment =!ヌル)。 Debug.Assertの(も参照(hostingEnvironment、webHostEnvironment))。 } 公共 ボイド設定(IApplicationBuilderアプリ){} }
第二に、射出プロセススタートアップの種類の設定
依存サービスもミドルウェアの登録のための設定方法に直接注入することができます。注入にコンストラクタ・インジェクションも含め、設定方法、登録サービスの彼らのConfigureServices方法IHostBuilder、IWebHostBuilderおよびスタートアップを呼び出すことによって含む注入することができる任意の手段によって、登録サービスのために、その後、サービスの選択肢を持つことができる場合すべてのサービスの自己登録の枠組み。
コードの次のコード断片、我々はIFoo IBARインターフェース、2つのサービス構成スタートアップの直接注入法のための登録及びサービスインターフェースのIWebHostBuilder起動ConfigureServicesメソッドをそれぞれ呼び出します。また、設定方法は、ミドルウェアが引数として使用登録されますが、パラメータが表示された場所に制限がありませんでしたIApplicationBuilderを提供することを目的とする必要があります。
クラスプログラム { 静的 ボイドメイン() { Host.CreateDefaultBuilder()。ConfigureWebHostDefaults(ビルダー => ビルダー .UseStartup <起動時> () .ConfigureServices(SVCの => svcs.AddSingleton <IFoo、フー> ())) .Build() .RUN()。 } } パブリック クラス起動 { 公共 ボイド ConfigureServices(IServiceCollectionサービス)=> services.AddSingleton <IBAR、バー> (); 公共の 無効設定(IApplicationBuilderアプリ、IFoo fooという、IBARバー) { Debug.Assertの(FOO =!ヌル)。 Debug.Assertの(バー =!ヌル)。 } }
三、ミドルウェア内噴射型のコンストラクタ
最も重要なオブジェクトASP.NETコアミドルウェア要求処理パイプラインは、実際に要求を処理するために使用されます。ASP.NETコアオブジェクトの作成におけるミドルウェア、彼らは全体の要求処理パイプラインの利用率を構築するので、登録されているすべてのサービスは、ミドルウェア・タイプのコンストラクタに注入することができるので、すべてのサービスがすでに登録されています。コードは、以下に示す射出コンストラクタのミドルウェアのタイプを反映しているスニペット。
クラスプログラム { 静的な 無効メイン() { Host.CreateDefaultBuilder()。ConfigureWebHostDefaults(ビルダー => ビルダー .ConfigureServices(SVCの => SVCの .AddSingleton <FoobarMiddleware> () .AddSingleton <IFoo、フー> () .AddSingleton <IBAR、バー> ()) .Configure(APP => app.UseMiddleware <FoobarMiddleware> ())) .Build() .RUN(); } } パブリック クラスFoobarMiddleware:IMiddleware { 公共FoobarMiddleware(IFoo fooという、IBARバー) { Debug.Assertの(FOO =!ヌル;) Debug.Assertの(バー =!ヌル)。 } パブリックタスクInvokeAsync(のHttpContextコンテキスト、RequestDelegate次) { Debug.Assertの(次!= NULL ); 返すTask.CompletedTaskを。 } }
第四に、中間インジェクションタイプ起動/ InvokeAsync方法
ミドルウェアタイプが合意された方法に基づいて定義されている場合、サービスはまた、直接注入InvokeAsync Invokeメソッドまたは実際の要求を処理するための方法を登録することができます。さらに、この方法は、TAP(タスクベースの非同期パターン)モードのプログラミング、主バージョンの互換性のために、Invokeメソッド名を保持する理由に沿って複数InvokeAsync名前。コードはInvokeAsync注入法のためのショーのサービスの下に表示スニペット。
クラスプログラム { 静的な 無効メイン() { Host.CreateDefaultBuilder()。ConfigureWebHostDefaults(ビルダー => ビルダー .ConfigureServices(SVCの => SVCの .AddSingleton <IFoo、フー> () .AddSingleton <IBAR、バー> ()) .Configure(アプリ => app.UseMiddleware <FoobarMiddleware> ())) .Build() .RUN(); } } パブリック クラスFoobarMiddleware { プライベート 読み取り専用RequestDelegate _next。 公共 FoobarMiddleware(RequestDelegate次)=> _next = 次回。 パブリックタスクInvokeAsync(のHttpContextコンテキスト、IFoo fooという、IBARバー) { Debug.Assertの(コンテキスト =!ヌル)。 Debug.Assertの(FOO =!ヌル)。 Debug.Assertの(バー =!ヌル)。 リターン_next(コンテキスト)。 } }
ミドルウェアの種類の合意の定義とスタートアップの種類は、同様のサービス注入法、それらのすべてのサポートコンストラクタ・インジェクションや注入方法を使用しますが、それらの間のいくつかの違いがありますが。ミドルウェア型コンストラクタ、メソッド設定スタートアップの種類やミドルウェアタイプInvokeAsync InvokeメソッドまたはRequestDelegateを入力されている必要なパラメータを有する方法、IApplicationBuilderのHttpContextと、リスト全体パラメータにこの位置のために、フロントどちらのみ必要とする制限を行わないこと、最初のパラメータとして現在の要求のコンテキストパラメータなければならないのHttpContext方法。上記の規則によると、これはFoobarMiddlewareミドルウェアの種類を次のように定義されるが、法的ではなく、Starup型定義は有効です。このために、私は、この制限は、ミドルウェア・タイプの定義だけでなく、より柔軟性があるので、こと、オープンすることができ、また一貫性の注入方法を確保するためにと考えています。
パブリック クラスFoobarMiddleware { 公共FoobarMiddleware(RequestDelegate次)。 パブリックタスクInvokeAsync(IFoo fooという、IBARバー、のHttpContextコンテキスト)。 } パブリック クラス起動 { 公共 ボイド設定(IFooのFOO、IBARバー、IApplicationBuilderアプリ)。 }
注射のために本質的な違いは、所定の方法に基づいて、ミドルウェア、およびコンストラクタ注入が存在します。ミドルウェアは以下のように登録されているのでシングルトンオブジェクトので、私たちはそのコンストラクタに注入すべきではないスコープサービスを提供しています。スコープミドルウェアサービスのみInvokeAsync注入工程を入力することができ、現在の要求の中で提供されるサービスの範囲の従属サービスであり、スコープは現在のサービス要求処理終了後に放出される確保することができます。
V.注入型のコンストラクタコントローラ
ASP.NETコアMVCアプリケーションでは、我々はコントローラで定義されたサービス注入の注入方法をコンストラクタことができます。以下に示すコードでは、我々はIFoobarサービスは、コンストラクタにHomeControllerに注入します。
クラスプログラム { 静的な 無効メイン() { Host.CreateDefaultBuilder()。ConfigureWebHostDefaults(ビルダー => ビルダー .ConfigureServices(SVCの => SVCの .AddSingleton <IFoobar、FOOBAR> () .AddSingleton <IBAR、バー> () .AddControllersWithViews() ) .Configure(APP => アプリ .UseRouting() .UseEndpoints(エンドポイント => endpoints.MapControllers()))) .Build() .RUN(); } } パブリック クラスにHomeController:コントローラ { パブリックにHomeController(IFoobar foobarに)=> Debug.Assertの(!foobarに= ヌル); }
のアクションコントローラの注入法では第六に、
パラメータが結合するための結合機構に基づいてASP.NET MVCのコアモデルにより、我々は行動の依存性のための注入方法を実現するように、アクションメソッドのパラメータ標的に結合したサービスを登録することができます。注入法のこのタイプを使用する場合、我々は、注入パラメータに以下のようにマークする必要がFromServicesAttribute結合ソースパラメータが登録されたサービスであるかを決定するために、特性。
クラスプログラム { 静的 ボイドメイン() { Host.CreateDefaultBuilder()。ConfigureWebHostDefaults(ビルダー => ビルダー .ConfigureServices(SVCの => のSVC .AddSingleton <IFoobar、FOOBAR> () .AddControllersWithViews()) .Configure(APP => アプリ 。 )(UseRouting .UseEndpoints(エンドポイント => endpoints.MapControllers()))) .Build() .RUN(); } } パブリック クラスHomeController:コントローラ { [HTTPGET(" / " )] パブリック 無効指数([FromServices] IFoobar foobarに) { Debug.Assertの(foobarに!= nullの); } }
セブンビューに注入しました
ASP.NET MVCのコアアプリケーションでは、我々はまた、現在ビューのサービスに登録することができます。私たちは次のような簡単なMVCのプログラムを定義すると仮定し、シンプルにHomeControllerを定義します。
クラスプログラム { 静的 ボイドメイン() { Host.CreateDefaultBuilder()。ConfigureWebHostDefaults(ビルダー => ビルダー .ConfigureServices(SVCの => のSVC .AddSingleton <IFoobar、FOOBAR> () .AddControllersWithViews()) .Configure(APP => アプリ 。 )(UseRouting .UseEndpoints(エンドポイント => endpoints.MapControllers()))) .Build() .RUN(); } } パブリック クラスHomeController:コントローラ { [HTTPGET(" / " )] パブリック IActionResult指数()=> 表示()。 }
我々は(「/」)ルートへのルーティングパスを定義する前に行動指数の方法はにHomeController、デフォルトビュービューのメソッド呼び出し、ViewBagフォームに表示するために注入IFooサービス・デリバリーで提示する方法です。コードスニペットは、アクションビュー(/Views/Home/Index.cshtml)の定義にこの方法を対応していることを下に示し、我々は現在のViewオブジェクトという、foobarのに@Inject IFoobarサービス命令および属性名でこの手段を注射しプロパティFOOBAR基準噴射サービスを追加します。
@Inject IFoobar FOOBAR @ { Debug.Assertの(foobarに!= nullの); }