ASP.NET Core依存注入(DI)

2149 ワード

ASP.NET Coreでは、登録サービスの生存期間を指定できます.サービスインスタンスは、指定する生存時間に基づいて自動的に処理される.そのため、私たちはこの依存関係を整理する心配はありません.彼はASP.NET Coreフレームワーク処理以下の3種類のライフサイクルがある.分かりやすい内容を注入することに依存することについて、皆さんは私の前の文章を見てもいいです.NET IoCモード依存反転(DIP)、制御反転(Ioc)、依存注入(DI)Microsoft.Extensions.DependencyInjection.ServiceLifetime列挙値
public enum ServiceLifetime
{
  Singleton,
  Scoped,
  Transient
}

Singleton


アプリケーションは、アプリケーションのライフサイクル中にこのインスタンスを作成し、共有する.IServiceCollectionのAddSingletonメソッドを使用して、サービスを一例として追加できます.ASP.NET Coreは、登録時にサービスインスタンスを作成する、そのサービスインスタンスの使用を要求するたびに行う.

Transient


リクエストするたびに新しいインスタンスを作成することができます.IServiceCollectionのAddTransientメソッドを使用して、Transientとしてサービスを追加できます.

Scoped


アプリケーションの要求に基づいてサービスインスタンスが作成され共有する.これは、各リクエストが1つのサービスインスタンスを使用できることを意味する.彼は新しいリクエストごとに新しいインスタンスを作成します.IServiceCollectionのAddScopedメソッドを使用して、サービスをScopedとして追加できます.

コントローラ依存注入


ASP.NET Coreはコンストラクション関数のデフォルトサポートを有し、コントローラに必要な依存はコンストラクション関数にコントローラにサービスを追加するだけである.ASP.NET Coreはこのサービスタイプを認識し、そのタイプを解析します.
private readonly IMessage _message;
public HomeController(IMessage message){
    this._message=message;
}
public IActionResult Index(){
    ViewData["msg"] = _message.Get();
    return View();
}

メソッド注入


ASP.NET CoreはFromServicesプロパティを通じて注入に依存することができます

public IActionResult Index([FromServices]IMessage message){
    ViewData["msg"] = message.Get();
    return View();
}

手動注入


この場合のサービスは、コントローラ構築関数やコントローラにパラメータとして注入することはない.HttpContextを使用RequestServicesのGetServiceメソッドは、このServiceコンテナ構成の依存サービスを得ることができます.

public IActionResult Index(){
    var message=(IMessage)this.HttpContext.RequestServices.GetService(typeof(IMessage));
    ViewData["msg"] = message.Get();
    return View();
}

サービスをビューに登録


依存項目をViewに注入することもできる.以下のコードクリップのように@inject命令を使用してサービス依存項目をビューに注入することができる.
@inject IMessage message

@message.Get()

デフォルトでは属性注入は提供されていません.必要に応じてサードパーティIocフレームワークを参照してください