Невозможно внедрить HttpClient в типизированном клиенте при использовании с библиотекой IMediatR - PullRequest
3 голосов
/ 18 марта 2019

В соответствии с примерами, приведенными в документации ASP.NET Core 2.2 в MSDN , можно внедрить HttpClient для типизированных клиентов (классов обслуживания), добавив следующую строку в Startup.cs:

// 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 - API-проект ASP.NET Core 2.2 и библиотека классов .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 (команда) строка.

Тело исключения:

System.InvalidOperationException: Ошибка создания обработчика для запроса типа MediatR.IRequestHandler`2 [IDocs.CryptoServer.Core.Commands.ExtractX509Command, IDocs.CryptoServer.Core.Commands.ExtractX509CommandResult]. Зарегистрируйте ваши обработчики в контейнере. Смотрите примеры в GitHub. ---> System.InvalidOperationException: невозможно разрешить службу для типа 'System.Net.Http.HttpClient' при попытке активировать 'IDocs.CryptoServer.Core.Handlers.ExtractX509CommandHandler'

(ExtractX509CommandHandler - просто модель реального домена вместо GetGitHubRepositoryHandler).

Похоже, ASP.NET Core DI не может разрешить DI и внедрить HttpClient в обработчик.

My Startup.cs имеет следующие строки:

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

1 Ответ

2 голосов
/ 18 марта 2019

Я нашел решение.По некоторым причинам в этом случае нам нужно передать IHttpClientFactory из Microsoft.Extensions.Http.dll вместо HttpClient в класс обработчика.Я только что изменил одну строку, это было:

public GetGitHubRepositoryHandler(HttpClient httpClient)

, а теперь:

public GetGitHubRepositoryHandler(IHttpClientFactory httpClientFactory)

, и теперь оно работает как надо.Я не знаю, почему это работает, поэтому было бы идеально, если бы кто-то мог объяснить, в чем разница между внедрением IHttpClientFactory и HttpClient в класс.

...