1. ホーム
  2. Web プログラミング
  3. ASP.NET
  4. 基本的なアプリケーション

ASP.NET Core 6で依存関係を解決する3つの方法

2022-01-13 18:52:42

依存性注入とは、特定のクラスに依存するオブジェクトを、そのインスタンスを直接作成するのではなく、注入することができるようにする技術です。

依存性注入を使用するメリットは明らかで、モジュール間の結合を緩めることでシステムの保守性とテスト容易性を向上させることができます。

依存性注入により、依存する依存関係の種類を変更することなく、具体的な実装を変更することができます。

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つの方法についての記事は以上です。学習のお役に立てれば幸いですし、スクリプトハウスをもっと応援していただければと思います。