將依賴項注入 Controller Action

一個鮮為人知的內建函式是使用 FromServicesAttribute 進行控制器動作注入。

[HttpGet]
public async Task<IActionResult> GetAllAsync([FromServices]IProductService products)
{
     return Ok(await products.GetAllAsync());
}

一個重要的注意事項是 [FromServices] 不能用作一般的 Property InjectionMethod injection 機制! 它只能用於控制器動作或控制器建構函式的方法引數(在建構函式中它已經過時,因為 ASP.NET Core DI 系統已經使用了建構函式注入,並且不需要額外的標記)。

它不能在控制器,控制器動作之外的任何地方使用。它也非常特定於 ASP.NET Core MVC 並且位於 Microsoft.AspNetCore.Mvc.Core 程式集中。

ASP.NET Core MVC GitHub 問題的原始引用( 限制[FromServices]僅適用於引數 )有關此屬性的原始引用 :

@rynowak:

@Eilon:

屬性的問題在於,許多人認為它可以應用於任何物件的任何屬性。

同意,我們已經發布了許多使用者釋出的問題,對如何使用此功能感到困惑。確實存在相當多的反饋,“[FromServices]很奇怪,我不喜歡它”和“[FromServices]讓我困惑”。這感覺就像一個陷阱,這個團隊在幾年後仍然會回答問題。

我們認為[FromServices]最有價值的方案是將方法引數轉換為你在該位置只需要的服務的操作。

/ cc @ danroth27 - 文件更改

對於任何愛上當前[FromServices]的人,我強烈建議你研究可以進行屬性注入的 DI 系統(例如 Autofac)。

筆記:

  • **** 使用 [FromServices] 屬性可以在控制器的操作中注入使用 .NET Core Dependency Injection 系統註冊的任何服務。

  • 最相關的情況是,你只需要在單個操作方法中使用服務,並且不希望將控制器的建構函式與另一個依賴項混淆,後者僅使用一次。

  • 不能在 ASP.NET Core MVC 之外使用(即純 .NET Framework 或 .NET Core 控制檯應用程式),因為它駐留在 Microsoft.AspNetCore.Mvc.Core 程式集中。

  • 對於屬性或方法注入,你必須使用第三方 IoC 容器之一(Autofac,Unity 等)。