gpt4 book ai didi

c# - 与 IMediatR 库一起使用时无法在类型化客户端中注入(inject) HttpClient

转载 作者:行者123 更新时间:2023-11-30 15:52:08 27 4
gpt4 key购买 nike

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

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

从 Controller 类来看,它看起来像(从现在开始我将使用 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 类库。

我的 Controller :

// 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 方法时,它成功注入(inject)了 IMediator,但在 _mediator.Send(command) 行抛出异常。

异常主体:

System.InvalidOperationException: Error constructing handler for request of type MediatR.IRequestHandler`2[IDocs.CryptoServer.Core.Commands.ExtractX509Command,IDocs.CryptoServer.Core.Commands.ExtractX509CommandResult]. Register your handlers with the container. See the samples in GitHub for examples. ---> System.InvalidOperationException: Unable to resolve service for type 'System.Net.Http.HttpClient' while attempting to activate 'IDocs.CryptoServer.Core.Handlers.ExtractX509CommandHandler'

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

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

我的 Startup.cs 有以下几行:

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

最佳答案

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

public GetGitHubRepositoryHandler(HttpClient httpClient)

现在:

public GetGitHubRepositoryHandler(IHttpClientFactory httpClientFactory)

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

关于c# - 与 IMediatR 库一起使用时无法在类型化客户端中注入(inject) HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55222219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com