如何将多个HttpClient参数传递/注入到类型化的HttpClientClass中?

问题描述 投票:0回答:1

我想在这里注册一个类型化的HttpClient Microsoft docs。基本上,方法应该是

services.AddHttpClient();

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

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

如果我试图从控制器解析IMyHttpClient,我得到一个错误,说它无法解析HttpClient。

在第43行AddHttpClient的GitHub代码中,您可以看到调用DefaultTypedHttpClientFactory。如果你去实施DefaultTypedHttpClientFactory implementation,你会发现它是一个通用类型。当它调用CreateClient时,它只将一个参数传递给第39行的构造函数。

我在这里看到的唯一解决方法是不创建一个类型化的客户端并注册一个接收IHttpClientFactory的普通类,并在运行时创建和配置我的客户端,而不是键入。还有其他想法吗?

c# asp.net-core dependency-injection .net-core dotnet-httpclient
1个回答
1
投票

你不能。您需要直接注入另一个服务层或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 => { ... });

注入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=> { ... });
© www.soinside.com 2019 - 2024. All rights reserved.