В соответствии с примерами, приведенными в документации 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);