哪种使用HTTPCLIENTFACTORY的方法更好



我正在使用ASP.NET Core开发Web API服务,我需要执行HTTP请求。我阅读了很多有关HTTPCLCLIENT的信息,我知道我必须使用HTTPCLIENTFACTORY。我将把HTTP请求呼叫删除到我的自定义类中。

我希望客户请求数量相对较大,并且尝试了解哪种方式在绩效方面更好(附有两个示例(?

我更喜欢第二种方式,因为我可以将其用于静态类,但我不确定性能。

// IHttpClientFactory registration
public void ConfigureServices(IServiceCollection services)
{
 services.AddHttpClient();
}

// my first way (dependency injection into custom class)
public class CustomClass
{
  private readonly IHttpClientFactory _clientFactory;
  public CustomClass(IHttpClientFactory clientFactory)
   {
     _clientFactory = clientFactory;
   }
}
// my second way
var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
var client = httpClientFactory.CreateClient();

您的第一种方法是正确的。

public class CustomClass
{
  private readonly IHttpClientFactory _clientFactory;
  public CustomClass(IHttpClientFactory clientFactory)
   {
     _clientFactory = clientFactory;
   }
}

以这种方式,您允许依赖注入可以解决IHttpClientFactory服务,而无需从您身边付出很多努力。DI容器在您的应用程序的整个生命周期内都存在,并处理各种服务的创建 - 例如,它可以使工厂随时准备在要求时提供HttpClient的实例。光滑,迅速而安全。服务的配置仅发生一次 - 在应用程序启动时。

第二路

您的第二种方法将分配大量不必要的新对象(消耗更多的RAM(,如您所说的 - "相对较大的客户端请求" 。那是因为您基本上是在做IOC容器会做的事情,但是可以手工和明显的开销。假设您不会在单例中使用此代码,而是在范围或瞬态服务中(请参阅此处的差异(,然后在每个传入请求时,您都会创建服务集合,添加必要的服务,创建服务提供商,尝试解决工厂。并最终创建一个HttpClient

以您的第一个方式仅执行最后两个步骤 - 解决工厂并创建新的HttpClient。所有其他均由di。

处理

面包店

想象拥有一家面包店。每天都有数百个客户来。他们都要求已知的美味佳肴 - 您著名的布朗尼。为了能够生产足够的蛋糕,您想出了两种生产方法:

方法#1

您在开设面包店之前开始新的一天并进行安排 - 您清洁菜肴,加热烤箱,准备面团等碗和食材等。即时的布朗尼,因为面包店里的所有东西都在手头。

方式#2

您从当时开始去面包店开放的一天。您没有做准备。只有当客户出现时,您才开始加热烤箱,收集碗和食材 - 所有这些都可以制作一个布朗尼。完成后,您将所有东西放回原处,关闭烤箱,即使您可以看到面包店前有一个很长的队列。下一个客户端接近时 - 您再次开始该过程。

结论

希望您能看到第一种方法的更好性能。当然,面包店的第二种方式被犹豫不决地夸大了,但这只是为了显示更大的对比。

自己创建服务提供商并不是一件坏事。您只需要有一个充分的理由去做,例如数据库种子或单位/集成测试。

最新更新