依赖注入:HttpClient 还是 HttpClientFactory?
Dependency injection: HttpClient or HttpClientFactory?
我到处都可以看到在 DI 中创建客户端(基本、命名、类型)的三种主要方法,但我找不到注入 IHttpClientFactory
或 HttpClient
(两者都可能)的地方。
Q1:请问注入IHttpClientFactory
和HttpClient
有什么区别?
Q2:如果注入了IHttpClientFactory
,我每次调用都应该使用factory.CreateClient()
吗?
总结
HttpClient
只能在 Typed clients 内部注入
- 对于其他用途,您需要
IHttpClientFactory
- 在这两种情况下,
HttpClientMessageHandler
的生命周期都由框架管理,因此您不必担心(错误地)处置 HttpClients
。
例子
为了直接注入 HttpClient
,您需要注册一个特定的 Typed 服务来接收客户端:
services.AddHttpClient<GithubClient>(c => c.BaseAddress = new System.Uri("https://api.github.com"));
现在我们可以将其注入 typed GithubClient
public class GithubClient
{
public GithubClient(HttpClient client)
{
// client.BaseAddress is "https://api.github.com"
}
}
你不能在AnotherClient
里面注入HttpClient
,因为它不是到AnotherClient
public class AnotherClient
{
public AnotherClient(HttpClient client)
{
// InvalidOperationException, can't resolve HttpClient
}
}
但是,您可以:
1. 注入 IHttpClientFactory
并调用 CreateClient()
。此客户端将 BaseAddress
设置为 null
。
2. 或者将 AnotherClient
配置为不同类型的客户端,例如,不同的 BaseAdress
.
更新
根据您的评论,您正在注册一个 Named 客户端。还是从IHttpClientFactory.CreateClient()方法解析,但是需要通过client的'name'
注册
services.AddHttpClient("githubClient", c => c.BaseAddress = new System.Uri("https://api.github.com"));
用法
// note that we inject IHttpClientFactory
public HomeController(IHttpClientFactory factory)
{
this.defaultClient = factory.CreateClient(); // BaseAddress: null
this.namedClient = factory.CreateClient("githubClient"); // BaseAddress: "https://api.github.com"
}
遗憾的是我无法发表评论,只能 Post 回答。因此我建议您查看以下链接:
https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
关于您的问题,或多或少可以归结为:
Q1 -> IHttpClientFactory 处理 HttpClient 实例的连接池,如果 HttpClient 使用错误,这将帮助您解决链接中描述的加载和处理问题。
Q2 -> 是的,根据微软文档
,你应该使用 factory.create 客户端
我到处都可以看到在 DI 中创建客户端(基本、命名、类型)的三种主要方法,但我找不到注入 IHttpClientFactory
或 HttpClient
(两者都可能)的地方。
Q1:请问注入IHttpClientFactory
和HttpClient
有什么区别?
Q2:如果注入了IHttpClientFactory
,我每次调用都应该使用factory.CreateClient()
吗?
总结
HttpClient
只能在 Typed clients 内部注入
- 对于其他用途,您需要
IHttpClientFactory
- 在这两种情况下,
HttpClientMessageHandler
的生命周期都由框架管理,因此您不必担心(错误地)处置HttpClients
。
例子
为了直接注入 HttpClient
,您需要注册一个特定的 Typed 服务来接收客户端:
services.AddHttpClient<GithubClient>(c => c.BaseAddress = new System.Uri("https://api.github.com"));
现在我们可以将其注入 typed GithubClient
public class GithubClient
{
public GithubClient(HttpClient client)
{
// client.BaseAddress is "https://api.github.com"
}
}
你不能在AnotherClient
里面注入HttpClient
,因为它不是到AnotherClient
public class AnotherClient
{
public AnotherClient(HttpClient client)
{
// InvalidOperationException, can't resolve HttpClient
}
}
但是,您可以:
1. 注入 IHttpClientFactory
并调用 CreateClient()
。此客户端将 BaseAddress
设置为 null
。
2. 或者将 AnotherClient
配置为不同类型的客户端,例如,不同的 BaseAdress
.
更新
根据您的评论,您正在注册一个 Named 客户端。还是从IHttpClientFactory.CreateClient()方法解析,但是需要通过client的'name'
注册
services.AddHttpClient("githubClient", c => c.BaseAddress = new System.Uri("https://api.github.com"));
用法
// note that we inject IHttpClientFactory
public HomeController(IHttpClientFactory factory)
{
this.defaultClient = factory.CreateClient(); // BaseAddress: null
this.namedClient = factory.CreateClient("githubClient"); // BaseAddress: "https://api.github.com"
}
遗憾的是我无法发表评论,只能 Post 回答。因此我建议您查看以下链接:
https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
关于您的问题,或多或少可以归结为:
Q1 -> IHttpClientFactory 处理 HttpClient 实例的连接池,如果 HttpClient 使用错误,这将帮助您解决链接中描述的加载和处理问题。
Q2 -> 是的,根据微软文档
,你应该使用 factory.create 客户端