假设我在dotnet核心中具有以下控制器:
[Route("api/v1/[controller]")]
public class ValuesController : Controller
{
private readonly IHandler<ValuesRequest, ValuesResponse> _valueHandler;
private readonly IHandler<ValuesIdRequest, ValuesIdResponse> _valueIdHandler;
public ValuesController(IHandler<ValuesRequest, ValuesResponse> valueHandler,
IHandler<ValuesIdRequest, ValuesIdResponse> valueIdHandler)
{
_valueHandler = valueHandler;
_valueIdHandler = valueIdHandler;
}
[HttpGet]
public ValuesResponse Get(ValuesRequest request)
{
return _valueHandler.Handle(request);
}
[HttpGet("{id}")]
public ValuesIdResponse Get(ValuesIdRequest request)
{
return _valueIdHandler.Handle(request);
}
}
您可以在上面的代码中看到,我正在通过构造函数使用依赖项注入。但是,我在考虑如何减少代码量。因此,我正在考虑使用方法注入,这应该将代码减少为以下形式:
[Route("api/v1/[controller]")]
public class ValuesController : Controller
{
[HttpGet]
public ValuesResponse Get(ValuesRequest request, IHandler<ValuesRequest, ValuesResponse> handler)
{
return handler.Handle(request);
}
[HttpGet("{id}")]
public ValuesIdResponse Get(ValuesIdRequest request, IHandler<ValuesIdRequest, ValuesIdResponse> handler)
{
return handler.Handle(request);
}
}
我想知道是否可以结合控制器参数来做类似的事情。我尝试在网上找到答案,但是找不到类似的问题/解决方案。
答案 0 :(得分:5)
引用Action Injection with FromServices
有时候,您不需要为控制器内的多个动作提供服务。在这种情况下,将服务作为操作方法的参数注入可能是有意义的。通过使用属性
[FromServices]
标记参数来完成此操作,如下所示:
public ValuesResponse Get(ValuesRequest request, [FromServices]IHandler<ValuesRequest, ValuesResponse> handler)
{
return handler.Handle(request);
}
答案 1 :(得分:3)