ASP.NET Core 6で依存関係を解決する3つの方法
依存性注入とは、特定のクラスに依存するオブジェクトを、そのインスタンスを直接作成するのではなく、注入することができるようにする技術です。
依存性注入を使用するメリットは明らかで、モジュール間の結合を緩めることでシステムの保守性とテスト容易性を向上させることができます。
依存性注入により、依存する依存関係の種類を変更することなく、具体的な実装を変更することができます。
ASP.NET Coreでは依存性注入の技術が重視されています。ASP.NET Coreの組み込み依存性注入は、StructureMapやNinjectなどのIoC(Inversion of Control)コンテナほど機能は豊富ではありませんが、高速で設定も簡単、使いやすい機能モジュールを提供します。これを利用して、ASP.NET Coreのフレームワークサービスやアプリケーションサービスをインジェクトすることができます。
依存性注入と制御の逆転に関する知識は、以下のページに記載されています。 デザインパターン .
ASP.NET Core 6の依存関係を解決するための3つの異なるアプローチを紹介します。
この記事で提供されるコード例は、すべてデフォルトでVisual Studio 2022で実行されます。
VS2022でASP.NET Coreプロジェクトを作成する
Visual Studio 2022 で ASP.NET Core プロジェクトを作成します。以下の手順で、Visual Studio 2022でASP.NET Core Web API 6プロジェクトを新規に作成します。
- 1) Visual Studio 2022 IDE を起動します。
- 2) 「新しいプロジェクトを作成」をクリックします。
- 3) 「新しいプロジェクトの作成」ウィンドウで、表示されたテンプレートの一覧から「ASP.NET Core Web API」を選択します。 {を選択します。 4) [次へ] をクリックします。
- 5) "Configure your new project "ウィンドウで、新しいプロジェクトの名前と場所を指定します。 {を選択します。 6) 好みに応じて、"Place solution and project in the same directory" チェックボックスにチェックを入れます。 {を選択します。 7) 「次へ」をクリックします。
- 8) 次に表示される「追加情報」ウィンドウで、上部のドロップダウンリストから、ターゲットフレームワークとして.NET 6.0を選択します。認証の種類」は「なし」(デフォルト)のままにしておきます。
- 9) "Enable Docker,", "Configure for HTTPS", "Enable Open API Support " のチェックボックスは、ここでは使用しないので確認してください。また、"Use controllers (uncheck to use minimal API)" チェックボックスのチェックを外すことも可能です。
- 10) [作成]をクリックします。
これで、Visual Studio 2022 に ASP.NET Core 6 Web API プロジェクトが新規に作成されます。この記事の後続のセクションで、このプロジェクトを使用して依存関係を解決することを説明します。
2. コンストラクタ注入による依存関係の解消
では、次のようなインターフェイスを作成します。
public interface ICustomFileLogger
{
public string Text { get; set; }
public void Log(string message);
}
わかりやすくするために、最小限の表現をする。
CustomFileLogger
クラス実装
ICustomFileLogger
インタフェースを以下のようなコードで記述します。
public class CustomFileLogger : ICustomFileLogger
{
public string Text { get; set; }
public void Log(string message)
{
// own implementation logic
}
}
ASP.NET5を使用している場合は、ASP.NET5で使用されているアプリケーションに
ConfigureServices
メソッドで登録します。
ICustomFileLogger
のインスタンスとして作成されます。
Scoped
サービスです。ASP.NET 6を使用している場合は、Program.csファイルに直接登録されます。
サービス.AddScoped {{icustomfilelogger, (); {{/icustomfilelogger,
次に、次のような名前のファイルを作成します。
DefaultController
APIコントローラに、以下のコードを入力します。
[Route("api/[controller]")]
[ApiController]
public class DefaultController : ControllerBase
{
private ICustomFileLogger _logger;
public DefaultController(ICustomFileLogger logger)
{
_logger = logger;
if(string.IsNullOrEmpty(_logger.Text))
_logger.Text = DateTime.UtcNow.ToString();
}
[HttpGet]
public string Get()
{
return "Hello World!";
}
}
ここでは、コンストラクタ注入がどのように使用されているかに注目してください。
DefaultController
クラスのコンストラクタは
ICustomFileLogger
型のインスタンスを引数にとります。
3. アクションメソッドインジェクションによる依存関係の解消
注入されたインスタンスを複数のメソッドで使用する必要がある場合、コンストラクタ注入を使用する必要があります。特定のアクションメソッドでのみインスタンスを使用する必要がある場合は、 コンストラクタ注入を使用せず、アクションメソッドでインスタンスを注入するのがよいでしょう。
次のコードは、アクションメソッドインジェクションの実装方法を説明するものです。
{{コード
4. IServiceProviderを使用して依存関係を解決する
私たちは時々、多くの異なるサービスをコントローラに注入する必要があることがよくあります。その場合、コンストラクタに複数のパラメータを指定する必要があります。そこで、このような場合のよりよい方法として
[HttpPost("Log")]
public IActionResult Log([FromServices] ICustomFileLogger customFileLogger)
{
// own implementation logic
return Ok();
}
.
を使用することができます。
IServiceProvider
インターフェイスを使用して、依存性注入コンテナを作成します。コンテナが作成されると
IServiceCollection
のインスタンスに結合されます。
IServiceCollection
インスタンスです。このインスタンスを使って、サービスを解決することができるのです。
を設定することができます。
IServiceProvider
型のインスタンスをクラスの任意のメソッドに渡すことができます。また
IServiceProvider
のインターフェイスを使用します。
IApplicationBuilder
プロパティと
{{コード
のクラスがあります。
ApplicationServices
プロパティを取得します。
HttpContext
のインスタンスを作成します。
次のコードは、インジェクションの方法を示しています。
RequestServices
型のインスタンス
IServiceProvider
アクションメソッドで以下のコードを使用すると、必要なサービスのインスタンスを取得することができます。
ICustomFileLogger logger = (ICustomFileLogger)_provider.GetService(typeof(ICustomFileLogger)).Logger = (ICustomFileLogger)_provider.GetService(typeof(ICustomFileLogger));
備考 {コード の {{コード {コード メソッドは、サービスインスタンスを取得する方法です。
を使用することができます。
IServiceProvider
のクラスがあります。
public class DefaultController : Controller
{
private IServiceProvider _provider;
public DefaultController(IServiceProvider provider)
{
_provider = provider;
}
}
プロパティを取得します。
IServiceProvider
型のインスタンスを作成し、そのインスタンスを使って
GetService
メソッドを使用します。
次のコードでは
HttpContext
のインスタンスを取得するために、クラスが行っています。
ICustomFileLogger logger = (ICustomFileLogger)HttpContext.RequestServices.GetService(typeof(ICustomFileLogger));
5.概要
依存性注入は、結合を緩めることによってコードの保守性とテスト容易性を高める方法です。
ASP.NET Coreに組み込まれた依存性注入のサポートを使用して、保守とテストが容易な、モジュール化された無駄のない、クリーンなアプリケーションを作成できます。
参考
1. デザインパターン
2. C#チュートリアル
ASP.NET Core 6で依存関係を解決する3つの方法についての記事は以上です。学習のお役に立てれば幸いですし、スクリプトハウスをもっと応援していただければと思います。
関連
-
NET 6の新しい設定オブジェクトConfigurationManagerの紹介
-
pythonでpillowをインストールする3つの方法
-
30分でわかるコング経由の.NETゲートウェイ
-
net core downlink tracking skywalking インストールと使いやすいチュートリアル
-
ネットのメモリ管理に関する5つの基本
-
NET 6 の今後の新機能 暗黙の名前空間参照
-
.NET 6における暗黙の名前空間参照
-
ASP.NET Coreで複数のサービス実装クラスをインジェクトする方法
-
Net CoreによるAutoFacの利用
-
asp.net core3.1 cookieとjwtのハイブリッド認証による多様な認証ソリューションの実現
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
.NET 6:.NETのロギングコンポーネントlog4netを使用する。
-
.NET Coreでオブジェクトプールを使用する
-
ASP.NET Core Dependency Injectionフレームワークの活用
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
ASP.NET CoreでCAPの取引詳細を自動で有効にする
-
swagger uiをasp.net coreに統合する原理
-
ASP.NET Coreミドルウェアによるグローバル例外処理機構の利用について
-
Net Core HttpClient処理 レスポンス圧縮の詳細
-
ASP.NET Core MVC Dependency Injection ビューとコントローラ
-
ASP.NETのオンライン統計とアプリケーションとセッションを使用した訪問履歴