与IMediatR库一起使用时,无法在类型化的客户端中注入HttpClient

时间:2019-03-18 13:12:22

标签: c# asp.net-core-2.0 mediatr

根据MSDN中ASP.NET Core 2.2文档提供的示例,可以通过在Startup.cs中添加以下行来将HttpClient注入类型化的客户端(服务类):

// Startup.cs
services.AddHttpClient<GitHubService>();

在控制器类中,它看起来像(从现在开始,我将使用GitHub作为域模型的简化):

// GitHubController.cs
public class GitHubController : Controller
{
    private readonly GitHubService _service;
    public GitHubController(GitHubService service)
    {
        _service = service;
    }
}

但是,我在项目中使用MediatR库,所以我的项目结构看起来有些不同。我有2个项目- GitHubFun.Api,GitHubFun.Core -分别是ASP.NET Core 2.2 API项目和.NET Core 2.2类库。

我的控制器:

// GitHubController.cs
public class GitHubController : Controller
{
    private readonly IMediator _mediator;
    public GitHubController(IMediator mediator)
    {
        _mediator= mediator;
    }

    public async Task<IActionResult> GetGitHubRepositoryInfo(
        GetGitHubRepositoryCommand command)
    {
         _mediator.Send(command);
    }
}

还有我的处理程序类:

// GetGitHubRepositoryHandler.cs
public class GetGitHubRepositoryHandler : 
    IRequestHandler<GetGitHubRepositoryCommand , GetGitHubRepositoryCommandResult>
{
    private HttpClient _httpClient;

    public GetGitHubRepositoryHandler(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }
}

当我发出HTTP请求并调用API方法时,它成功注入了IMediator,但在 _mediator.Send(command)行上引发了异常。

异常主体:

  

System.InvalidOperationException:为MediatR.IRequestHandler`2 [IDocs.CryptoServer.Core.Commands.ExtractX509Command,IDocs.CryptoServer.Core.Commands.ExtractX509CommandResult]类型的请求构造处理程序时出错。在容器中注册您的处理程序。有关示例,请参见GitHub中的示例。 ---> System.InvalidOperationException:尝试激活“ IDocs.CryptoServer.Core.Handlers.ExtractX509CommandHandler”时无法解析类型为“ System.Net.Http.HttpClient”的服务

(ExtractX509CommandHandler-只是一个真实的域模型,而不是GetGitHubRepositoryHandler)。

ASP.NET Core DI似乎无法解析DI并将HttpClient注入处理程序。

我的Startup.cs有以下几行:

services.AddHttpClient<ExtractX509CommandHandler>();
services.AddMediatR(
       typeof(Startup).Assembly, 
       typeof(ExtractX509CommandHandler).Assembly);

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。由于某些原因,在这种情况下,我们需要将Microsoft.Extensions.Http.dll的IHttpClientFactory而不是HttpClient传递给处理程序类。我只更改了一行,是:

public GetGitHubRepositoryHandler(HttpClient httpClient)

现在:

public GetGitHubRepositoryHandler(IHttpClientFactory httpClientFactory)

现在它可以正常工作了。我不知道为什么会这样,所以如果有人可以解释将IHttpClientFactory和HttpClient注入类之间的区别,那将是完美的。

答案 1 :(得分:-1)

我找到了解决方案。

我使用的是 ASP.NET Core 3.1。

我的处理程序类:

public class GetProductsListQueryHandler : IRequestHandler<GetProductsListQueryModel, IEnumerable<Product>>
{
    private readonly HttpClient _httpClient;

    public GetProductsListQueryHandler(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

你需要像这样在你的 Startup 中实现你的 HttpClient :

services.AddHttpClient<IRequestHandler<GetProductsListQueryModel,IEnumerable<Product>>, GetProductsListQueryHandler>();

它有效! ;)