asp.net-core 将依赖项注入Controller Action

示例

鲜为人知的内置功能是使用的Controller Action注入FromServicesAttribute。

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

重要说明是,[FromServices] 不能将其用作常规的“属性注入”或“方法注入”机制!它只能在控制器动作或控制器构造函数的方法参数上使用(尽管在构造函数中已过时,因为ASP.NETCore DI系统已经使用了构造函数注入,并且不需要额外的标记)。

不能在控制器以外的任何地方使用它,控制器动作。它也非常特定于ASP.NETCore MVC,并且驻留在Microsoft.AspNetCore.Mvc.Core程序集中。

ASP.NET核心MVC GitHub问题的原始报价(限制[FromServices]仅适用于参数)有关此属性:

@rynowak:

@埃隆:

属性的问题在于,对于许多人而言,它似乎可以应用于任何对象的任何属性。

同意,用户发布了许多问题,对于如何使用此功能感到困惑。实际上,“ [FromServices]很奇怪,我不喜欢”和“ [FromServices]让我感到困惑”这两种类型都确实有大量反馈。感觉就像是一个陷阱,而团队仍会在此回答几年以后的问题。

我们认为[FromServices]的最有价值的情况是在只需要在那个地方进行的一项服务操作的方法参数上。

/ cc @ danroth27-文档更改

对于热爱当前[FromServices]的任何人,我强烈建议您研究可以进行属性注入的DI系统(例如Autofac)。

笔记:

  • 可以使用[FromServices]属性将在.NET Core依赖注入系统中注册的所有服务注入到控制器的动作中。

  • 最相关的情况是,当您只需要一个动作方法中的服务,而又不想让控制器的构造函数与另一个依赖关系混杂在一起时,该依赖关系将仅使用一次。

  • 不能在ASP.NETCore MVC(即纯.NET Framework或.NET Core控制台应用程序)之外使用,因为它驻留在Microsoft.AspNetCore.Mvc.Core程序集中。

  • 对于属性或方法注入,您必须使用可用的第三方IoC容器之一(Autofac,Unity等)。