将依赖项注入 Controller Action
一个鲜为人知的内置函数是使用 FromServicesAttribute
进行控制器动作注入。
[HttpGet]
public async Task<IActionResult> GetAllAsync([FromServices]IProductService products)
{
return Ok(await products.GetAllAsync());
}
一个重要的注意事项是 [FromServices]
不能用作一般的 Property Injection
或 Method 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 等)。