当サイトを最適な状態で閲覧していただくにはブラウザのJavaScriptを有効にしてご利用下さい。
JavaScriptを無効のままご覧いただいた場合には一部機能がご利用頂けない場合や正しい情報を取得できない場合がございます。
同意しました
本サイトではWebサイトのエクスペリエンスを向上させるために、Cookieを使用しています。Cookieはブラウザの設定から無効にできます。詳細はこちらから

Blog

ブログ

ASP.NETコア:依存性注入とは何ですか?

By Sean G. Wright  


ASP.NETコア は依存性注入をサポート しています - 実際、それは大きくそれに依存しています!しかし、依存性注入(DI)とは正確には何ですか?


マイクロソフトのドキュメントでは 、次のように定義されています

'[a] ソフトウェアデザインパターンは、クラスとその依存関係の間で制御の反転(IoC)を達成するための技術です。

なんて素晴らしく抽象的なんだろう。これを分解しましょう。NET 開発者として、クラスがどのようなものかがわかっています。また、おそらく、クラスが動作するために 依存 している他のビット(クラス、インターフェイス、またはデータ)が何であるかも考えられます。

「コントロールの反転」はどうですか?Microsoft のドキュメントには 、依存関係の反転を説明する素晴らしい図がいくつかありますが、より簡単な説明方法があると思います。各クラスが依存するものの作成を管理する代わりに (多くの場合、c# で newkeyword を使用して)、そのコントロールを提供し、他の何かが作成され、各依存関係を提供することを期待して、必要なものを求めます。

依存関係の挿入は 、ASP.NET コアの世界では、通常、クラスの依存関係がそのコンストラクタで提供されているコンストラクターインジェクションを意味します。

簡単な例を見てみましょう:

パブリック インターフェイス IPet

{

文字列名 { 取得; }

}

公共クラス犬 :IPet

{

パブリックドッグ(文字列名) => 名前 = 名前;

パブリック文字列名 { 取得; }

}

パブリック クラス ペットオーナー

{

公共ペット所有者(IPetペット) => ペット =ペット;

パブリック IPet ペット { 取得; }

}

// ...後でアプリケーションを使用する

IPet犬=新しい犬('ポピー');

ペットオーナーショーン=新しいペットオーナー(犬)。

この例ではName 、PetOwnerPetの場合と同様に、の名前がコンストラクタ依存として提供されています。

これはコンストラクタによる依存性注入です!

これを行うことの利点は何ですか?

さて 、「新しい接着剤」という言葉があります。アプリケーションで 新しい キーワードを使用するたびに、特定の実装に自分自身を"接着"しています。

サンプル コードのバリエーションを見てみましょう。

パブリック クラス ペットオーナー

{

公共のペット所有者()=>ペット=新しい犬('ポピー');

パブリック IPet ペット { 取得; }

}

新しいはPetOwnerクラスの中にあり、すべてのPetOwner インスタンスが「ポピー」という名前のペットに「接着」されていることを意味します。それだけでなく、彼らはいつも犬になるでしょう!たぶん、それは私のユースケース🐕 🦺のために良いですが、あなたのものはどうですか?

新しいキーワードをクラスの外に移動しPet 、PetOwnerのコンストラクタを通して Pet を提供することで、あらゆる種類のPetOwnerIPetに提供することができます。これは私たちにとってはるかに便利になるでしょう!

柔軟性の利点は、テストの容易性にも影響を与えます!インターフェイスを介して依存関係を提供することで、アプリケーションの実行中にデータベース、Web サービス、およびファイル システムに接続するクラスに依存できます。同時に、それらを偽のバージョンに置き換え、いくつかのテストを実行したいときはいつでも、インターフェイスに従うことができます。

単体テストに関する Microsoft のドキュメントで、テスト用のインターフェイスを使用することの利点を参照してください。

コンテナに汚い作業をさせる

上記の例は、C# の 2 行で依存関係の挿入を実行する方法を示しています。しかし、アプリケーションが成長し始めると、型の数(インターフェイスやクラスなど)の数が増加し、それらの型の相互依存性が高まることに気付きます。

この複雑さは維持しにくくなる可能性があります。また、使用するクラスは依存関係があり、それぞれが独自の依存関係を持つため、作成が困難になる可能性があります。その後、すべてが作成され、実際に使用する1つのクラスの準備が必要です。 ヤクシェービングについて話す!

これらのクラスをすべて作成および管理することも難しくなる可能性があります。 lifetimes

一部の依存関係は、アプリケーションの有効期間 (Singletons) を持続する必要がありますが、他の依存関係は、現在の HTTP 要求 (Scoped) に一致する有効期間を持っています。残りは必要なたびに作成され、参照されなくなると破棄されます (Transient)。

幸いにも、依存関係の管理に役立つ共通のツールがあります。

依存性注入コンテナは、開発者が指示を与える特別に設計されたライブラリです。これらの手順では、アプリケーション内のすべての型を作成する方法と、それらの型の有効期間をコンテナーに指示します。

コンテナを使用することで、すべてのクラスとインターフェイスを 登録 し、コンテナに頼って 新しい'd を必要とするチェーンに従って、最終的にクラスのインスタンスを取得できます。

開発者が過去に新しいプロジェクトを開始するたびに、 多くの DI コンテナのいずれかを 選択し、そのコンテナーをアプリケーション用に構成する必要がありました。ASP.NETも .NET Framework も、その中から 1 つを提供していません。

しかし、ASP.NETコアでは、多くのことが変わりました!

ASP.NETコアでの依存性注入の仕組み

ASP.NETコアでは、依存関係の注入は、フレームワークが組み込みの DI コンテナーを提供する程度に、最初のクラスでサポートされる機能となっています。内部フレームワーク コードが依存関係挿入のデザイン パターンを使用できるように、フレームワーク自体はこのコンテナーに依存します。

開発者は、独自の特別な機能と利点を持つ多くの オープンソースのDIコンテナライブラリのいずれかを統合することも、ユースケースで他の機能が必要ない場合は組み込みのコンテナを使用することもできます。

依存関係の登録は、スタートアップクラスのConfigureServices()メソッドで実行されます。以下の例では、IUserServiceインターフェイスを実装するUserServiceを登録し、スコープ (要求ごとに 1 インスタンス) の有効期間で登録します。

パブリック void サービス (I サービスサービス、IWeb ホスト環境の羨望)

{

サービス。追加スコープ<IUserサービス、ユーザーサービス>();

}

この 1 行は 、UserService のインスタンスを 、IUserServiceのコンストラクタ パラメータを持つ任意のクラスで利用できるようにします。さらに、作成された各インスタンスが 、UserService が破棄される 1 つの要求内のクラス間でのみ共有されるようにします。

ケンティコ・クペリエンス13をASP.NETコアに統合

Kentico Xperience 13 は、ASP.NETコアと、依存関係の注入に対するフレームワークのアプローチを完全にサポートします。Xperience 13 を ASP.NET Core プロジェクトに統合する場合は、 ドキュメントを読んで 、すべての型とインターフェイスにアクセスする方法を確認するだけです。

キーラインは.アケンティコ(; スタートアップの拡張メソッド メソッド。

パブリック void サービス (I サービスサービス、IWeb ホスト環境の羨望)

{

サービス。アケンティコ(;

// ...

}

それは簡単です!ケンティコ・クペリエンスは私たちのためにすべての仕事をします。これは、正しい有効期間と共に、すべてのプラットフォームの型を登録します。つまり、追加の構成を行わずに、クラスのコンストラクタの任意の場所で IUserInfoProviderIPageRetrieverを使用できます。

もちろん、Kentico Xperience 13は、コンテンツ ツリーベースのルーティングページビルダーおよび柔軟なコンテンツ検索など、より多くの機能を提供しています。したがって、Kentico Xperience 13 と ASP.NET コアで依存関係の注入を設定して使用し始めたら、学び、探求する必要があります。

ご自身で探索したい場合は、 無料の試用版をダウンロードしてください。