ASP.NET Core依賴注入(DI)

ASP.NET Core允許我們指定註冊服務的生存期.服務實例將根據指定的生存時間自動處理.因此,我們無需擔心清理此依賴關係,他將由ASP.NET Core框架處理.有如下三種類型的生命週期.

Microsoft.Extensions.DependencyInjection.ServiceLifetime枚舉值

public enum ServiceLifetime
{
  Singleton,
  Scoped,
  Transient
}

Singleton

應用程序將在該應用程序生命週期內創建並共享這個實例.可以使用IServiceCollection的AddSingleton方法將服務作爲單例添加。ASP.NET Core在註冊時創建服務實例,並且在每次請求使用該服務實例.

Transient

我們可以使用它在每次請求時都會去創建一個新的實例.可以使用IServiceCollection的AddTransient方法將服務添加爲Transient.

Scoped

將根據應用程序的請求創建並共享服務實例.這意味着每個請求可以使用一個服務實例.他將爲每個新請求創建一個新實例.可以使用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();
}

手動注入

這種情況服務不會作爲參數注入到控制器構造函數或Controller中.使用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
<h1>@message.Get()</h1>

並沒有爲我們默認提供屬性注入.如果有需要可以參考第三方Ioc框架

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章