【问题标题】:Dotnet core method injection with controller methods带有控制器方法的 Dotnet 核心方法注入
【发布时间】:2018-08-03 19:39:26
【问题描述】:

假设我在 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);
    }
}

我想知道是否可以结合控制器参数来做这样的事情。我尝试在网上寻找答案,但找不到类似的问题/解决方案。

【问题讨论】:

标签: c# asp.net-core dependency-injection .net-core


【解决方案1】:

参考Action Injection with FromServices

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

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

【讨论】:

    【解决方案2】:

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

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

    微软的 IoC-Container 有一个很好用的 extension 来注册您的所有处理程序和所有其他必要的类以使用 MediatR。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2012-02-27
      • 2020-03-27
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多