为了账号安全,请及时绑定邮箱和手机立即绑定

使用控制器方法注入 dotnet 核心方法

使用控制器方法注入 dotnet 核心方法

C#
Cats萌萌 2021-11-14 14:52:40
假设我在 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);    }}我想知道是否可以结合控制器参数来做这样的事情。我尝试在网上找到答案,但是我找不到类似的问题/解决方案。
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

使用 FromServices 的参考动作注入

有时,您不需要为控制器中的多个操作提供服务。在这种情况下,将服务作为参数注入 action 方法可能是有意义的。这是通过使用属性标记参数来完成的,[FromServices]如下所示:

public ValuesResponse Get(ValuesRequest request, [FromServices]IHandler<ValuesRequest, ValuesResponse> handler){
    return handler.Handle(request);
    }


查看完整回答
反对 回复 2021-11-14
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

虽然答案可以在您的操作中使用 [FromService],但我还有另一个建议。

通过阅读您提供的代码,我了解到您使用了某种 CQRS。对于这种情况,我可以建议MediatR。然后,您只需将一个接口注入控制器并使用IMediator发送您的请求。通过这种方式,您将保持控制器小而干净,并且不需要注入所有其他处理程序。

Microsoft 的 IoC-Container有一个很好且方便的扩展,用于注册所有处理程序和所有其他使用 MediatR 所需的类。

services.AddMediatR(typeof(Startup).Assembly);


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 216 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信