首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型化HttpClient与IHttpClientFactory

类型化HttpClient与IHttpClientFactory
EN

Stack Overflow用户
提问于 2020-10-10 03:15:58
回答 3查看 2.4K关注 0票数 4

以下两种设置HttpClient的场景有什么区别吗?

我应该选择一个而不是另一个?

类型化客户端:

代码语言:javascript
复制
public class CatalogService 
{
    private readonly HttpClient _httpClient;
    
    public CatalogService(HttpClient httpClient) {
        _httpClient = httpClient;
    }
    
    public async Task<string> Get() {
        var response = await _httpClient.GetAsync();
        ....
    }
    
    public async Task Post() {
        var response = await _httpClient.PostAsync();
        ...
    }
}
// Startup.cs
//Add http client services at ConfigureServices(IServiceCollection services)
services.AddHttpClient<ICatalogService, CatalogService>();

IHttpClientFactory:

代码语言:javascript
复制
public class CatalogService 
{
    private readonly IHttpClientFactory _factory;
    
    public CatalogService(IHttpClientFactory factory) {
        _factory = factory;
    }
    
    public async Task<string> Get() {
        var response = await _factory.CreateClient().GetAsync();
        ....
    }
    
    public async Task Post() {
        var response = await _factory.CreateClient().PostAsync();
        ...
    }
}
// Startup.cs
//Add http client services at ConfigureServices(IServiceCollection services)
services.AddHttpClient();
代码语言:javascript
复制
EN

回答 3

Stack Overflow用户

发布于 2020-10-10 11:14:06

国际海事组织,我会通过HttpClient。原因是,

  1. KISS Principle - CatalogService真正需要的是HttpClient。该服务并不关心如何获取client.
  2. Single责任原则(SRP) -比方说明天你必须保留两个CatalogService实例来向两个不同的端点发送请求,
    • 你可以传入一个IHttpClientFactory并在CatalogService内部实现路由,但是这违反了SRP。
    • 或者,你可以创建一个CatalogServiceFactory。该工厂传入IHttpClientFactory并在其中实现路由。这也称为Concerns.

分离

票数 2
EN

Stack Overflow用户

发布于 2020-10-12 15:46:07

我认为,当你从消费的角度来看它们时,最大的区别就会显现出来。

类型化客户端

您将收到一个HttpClient实例,该实例可能已经使用针对瞬时故障的弹性策略和一些默认值进行了修饰。您甚至可能收到已经设置了BaseUrl的客户端。

因此,如果您需要将REST API客户端隐藏在强类型服务层之后,这种方法可能特别有用。

命名客户端

当您需要来自特定客户端的多个实例时,或者当您需要多个不同的客户端时,此技术将大放异彩。如果您使用不同的名称注册了多个不同的客户端,那么您可以通过单个API轻松地检索它们。

因此,如果您需要调用不同的下游系统,并且需要聚合它们的结果,这种方法可能会很有用。

文章读起来很棒

票数 2
EN

Stack Overflow用户

发布于 2020-10-10 03:41:41

具有抽象性(即IHttpClient)要好得多,也更受社区的好评。它允许您分配HttpClient以及自定义编写的IHttpClient,而无需更改CatalogService

在创建大型系统时,这是一个非常关键的点,因为您对具体实现的依赖性降低了,维护成本也降低了。

此外,使用抽象可以显示实际的用法,并减少可能的干扰。举个例子:

代码语言:javascript
复制
public interface MyInterface
{
    void UsefulMethod();
}

public class MyClass : MyInterface
{
    public float variable1;
    public float moreBurden;
    public float thisIsNotRequiredAtAll;

    public void UsefulMethod() {}
    public void AnotherMethod() {}
    public void MoreNoiseMethod() {}
}

public class MyService
{
    private MyClass _myClass;

    public MyService(MyClass myClass)
    {
        _myClass = myClass;
    }

    public void MyOnlyMethod()
    {
        _myClass.UsefulMethod();
    }
}

在这种情况下,您只使用一种方法,但是您的服务可以访问大量不必要的信息,从而分散了目标。要创建MyService,其创建者必须能够创建MyClass的实例。

现在图像MyService写成这样

代码语言:javascript
复制
public class MyService
{
    private IMyInterface _myInterface;

    public MyService(IMyInterface myInterface)
    {
        _myInterface = myInterface;
    }
   
    public void MyOnlyMethod()
    {
        _myInterface.UsefulMethod();
    }
}

现在,_myInterface的目的很明确--您只需要一个特定的方法子集。MyService只能访问这个单一的方法,不会被所有可能的实现细节分散注意力。

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

https://stackoverflow.com/questions/64286062

复制
相关文章

相似问题

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