c# - 如何将多个 HttpClient 参数传递/注入(inject)到类型化的 HttpClientClass?

标签 c# asp.net-core dependency-injection .net-core dotnet-httpclient

我想在这里注册一个键入的 HttpClient Microsoft docs .
基本上,该方法应该是

服务.AddHttpClient();

通常这些类的模式只接收 HttpClient 类作为参数,并且您实现调用端点的逻辑。就我而言,我需要在 MyHttpClient 中使用 2 个 HttpClient,一个用于 ping 端点,另一个与 IdentityProvider 对话以发现 refreshEndpoints 以刷新我的 cookie。

public class MyHttpClient : IMyHttpClient
{
    public MyHttpClient (HttpClient httpClient, 
                         HttpClient refreshHttpClient)
    {
    }
}

如果我试图从 Controller 解析 IMyHttpClient,我会收到一条错误消息,指出它无法解析 HttpClient。

在第 43 行的 GitHub 代码中 AddHttpClient你可以看到它正在调用
DefaultTypedHttpClientFactory。
如果你去执行DefaultTypedHttpClientFactory implementation你会注意到这是一个泛型类型。当它调用 CreateClient 时,它只在第 39 行将一个参数传递给构造函数。

我在这里看到的唯一解决方法是不创建类型化客户端并注册一个接收 IHttpClientFactory 的普通类,并动态创建和配置我的客户端,而不是类型化。
还有什么想法吗?

最佳答案

你不能。你要么需要注入(inject)另一个服务层,要么IHttpClientFactory直接地

另服务

public class MyRefreshClient
{
    private readonly HttpClient _httpClient;

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

    ...
}

public class MyHttpClient : IMyHttpClient
{
    private readonly HttpClient _httpClient;
    private readonly MyRefreshClient _refreshClient;

    public MyHttpClient(HttpClient httpClient, MyRefreshClient refreshClient)
    {
        _httpClient = httpClient;
        _refreshClient = refreshClient;
    }
}

然后:
services.AddHttpClient<MyRefreshClient>(c => { ... });
services.AddHttpClient<MyHttpClient>(c => { ... });

注入(inject) IHttpClientFactory (并使用命名客户端) :
public class MyHttpClient : IMyHttpClient
{
    private readonly HttpClient _httpClient;
    private readonly HttpClient _refreshClient;

    public MyHttpClient(IHttpClientFactory httpClientFactory)
    {
        _httpClient = httpClientFactory.CreateClient("MyHttpClient");
        _refreshClient = httpClientFactory.CreateClient("MyRefreshClient");
    }
}

然后:
services.AddHttpClient("MyHttpClient", c => { ... });
services.AddHttpClient("MyRefreshClient", c=> { ... });

关于c# - 如何将多个 HttpClient 参数传递/注入(inject)到类型化的 HttpClientClass?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55341613/

相关文章:

c# - 以管理员身份运行 : requireAdministrator & ClickOnce + emulating system time

c# - 我可以在 DbContext 的 ViewModel 中使用依赖注入(inject)吗?核心2.0

dependency-injection - 除了 TDD 之外,松散耦合代码还有其他好处吗?

java - Angular 开始(ReferenceError : angular is not defined)

dependency-injection - Jersey 2 每个请求 @Context 注入(inject)

c# - Parallel.For() 和 Windows 消息循环

c# - 在 ASP.NET 页面上显示的 SQL <二进制数据> 图像类型

c# - 从类访问 MainWindow 变量

asp.net-core - WebSocket 未处于 OPEN 状态

asp.net-core - 在MVC中执行ssis包