如何 pass/inject 多个 HttpClient 参数到类型化的 HttpClientClass?
How to pass/inject more than one HttpClient parameter to a typed HttpClientClass?
我想在这里注册一个类型化的 HttpClient Microsoft docs。
基本上,方法应该是
services.AddHttpClient();
通常这些 classes 的模式仅接收 HttpClient class 作为参数,您实现调用端点的逻辑。就我而言,我需要在我的 MyHttpClient 中使用 2 个 HttpClient,一个对端点执行 ping 操作,另一个与 IdentityProvider 通信以发现 refreshEndpoints 以刷新我的 cookie。
public class MyHttpClient : IMyHttpClient
{
public MyHttpClient (HttpClient httpClient,
HttpClient refreshHttpClient)
{
}
}
如果我尝试从控制器解析 IMyHttpClient,我会收到一条错误消息,指出它无法解析 HttpClient。
在第 43 行的 GitHub 代码中 AddHttpClient 你可以看到正在调用
DefaultTypedHttpClientFactory。
如果您查看 DefaultTypedHttpClientFactory implementation 的实现,您会注意到它是一个通用类型。当它调用 CreateClient 时,它只将一个参数传递给第 39 行的构造函数。
我在这里看到的唯一解决方法是不创建类型化客户端并注册接收 IHttpClientFactory 的普通 class 并即时创建和配置我的客户端,而不是类型化的客户端。
还有其他想法吗?
你不能。您需要注入另一个服务层或直接 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=> { ... });
我想在这里注册一个类型化的 HttpClient Microsoft docs。 基本上,方法应该是
services.AddHttpClient();
通常这些 classes 的模式仅接收 HttpClient class 作为参数,您实现调用端点的逻辑。就我而言,我需要在我的 MyHttpClient 中使用 2 个 HttpClient,一个对端点执行 ping 操作,另一个与 IdentityProvider 通信以发现 refreshEndpoints 以刷新我的 cookie。
public class MyHttpClient : IMyHttpClient
{
public MyHttpClient (HttpClient httpClient,
HttpClient refreshHttpClient)
{
}
}
如果我尝试从控制器解析 IMyHttpClient,我会收到一条错误消息,指出它无法解析 HttpClient。
在第 43 行的 GitHub 代码中 AddHttpClient 你可以看到正在调用 DefaultTypedHttpClientFactory。 如果您查看 DefaultTypedHttpClientFactory implementation 的实现,您会注意到它是一个通用类型。当它调用 CreateClient 时,它只将一个参数传递给第 39 行的构造函数。
我在这里看到的唯一解决方法是不创建类型化客户端并注册接收 IHttpClientFactory 的普通 class 并即时创建和配置我的客户端,而不是类型化的客户端。 还有其他想法吗?
你不能。您需要注入另一个服务层或直接 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=> { ... });