首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖注入: HttpClient还是HttpClientFactory?

依赖注入: HttpClient还是HttpClientFactory?
EN

Stack Overflow用户
提问于 2019-12-11 06:44:17
回答 2查看 52.3K关注 0票数 58

我在任何地方都可以看到在DI中创建客户机(basic、命名、类型化)的三种主要方法,但是如果注入IHttpClientFactoryHttpClient (两者都可能),我已经找不到任何地方了。

Q1:请问注射IHttpClientFactoryHttpClient有什么区别?

Q2:如果IHttpClientFactory被注入,我应该在每个调用中使用factory.CreateClient()吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-11 08:04:46

摘要

  • HttpClient只能被注入到类型的客户端
  • 中用于其他用途,您需要IHttpClientFactory
  • In这两种场景,HttpClientMessageHandler的生存期由框架管理,所以您不会担心(错误地)处理HttpClients.

示例

为了直接注入HttpClient,需要注册特定的类型化服务,该服务将接收客户端:

代码语言:javascript
复制
services.AddHttpClient<GithubClient>(c => c.BaseAddress = new System.Uri("https://api.github.com"));

现在,我们可以将其插入类型化的 GithubClient中。

代码语言:javascript
复制
public class GithubClient
{
    public GithubClient(HttpClient client)
    {
        // client.BaseAddress is "https://api.github.com"
    }
}

不能将HttpClient注入到AnotherClient中,因为没有将输入到AnotherClient

代码语言:javascript
复制
public class AnotherClient
{
    public AnotherClient(HttpClient client)
    {
        // InvalidOperationException, can't resolve HttpClient 
    }
}

但是,你可以:

  1. 注入IHttpClientFactory并调用CreateClient()。这个客户端将null.
  2. Or设置为BaseAddress,将AnotherClient配置为不同类型的客户机,例如,使用不同的BaseAdress.

更新

根据您的评论,您正在注册一个名为客户端。它仍然是从IHttpClientFactory.CreateClient()方法解析的,但是您需要传递客户机的“名称”

Registration

代码语言:javascript
复制
services.AddHttpClient("githubClient", c => c.BaseAddress = new System.Uri("https://api.github.com"));

使用

代码语言:javascript
复制
// 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"
}
票数 72
EN

Stack Overflow用户

发布于 2019-12-11 08:10:10

遗憾的是,我不能发表评论,但只是张贴一个答复。因此,我建议您查看以下链接:

https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

关于你的问题,大致可以归结为:

Q1 -> IHttpClientFactory处理HttpClient实例的连接池,如果HttpClient使用错误,这将帮助您将加载和处理问题视为链接中的描述。

Q2 ->是的,根据microsoft文档,您应该使用factory.create客户端。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59280153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档