使用services.AddHttpClient时,在哪里创建HttpClient?

时间:2019-05-31 07:51:19

标签: c# asp.net-core-mvc nopcommerce

我试图了解如何在Nop Commerce中为验证码实施HttpClient,并且为了可测试性,如何在Nop Commerce项目中管理创建HttpClient的新实例。

我遇到了ValidateCaptchaAttributeValidateCaptchaFilter,我发现HttpClient已被包装在CaptchaHttpClient类中 但我不知道CaptchaHttpClient从何处获得对HttpClient的依赖关系,以及从何处调用CaptchaHttpClient类的构造函数。

ServiceCollectionExtensions类内部,我看到以下代码:

public static void AddNopHttpClients(this IServiceCollection services)
 {
    //default client
    services.AddHttpClient(NopHttpDefaults.DefaultHttpClient).WithProxy();

    //client to request current store
    services.AddHttpClient<StoreHttpClient>();

    //client to request nopCommerce official site
    services.AddHttpClient<NopHttpClient>().WithProxy();

    //client to request reCAPTCHA service
    services.AddHttpClient<CaptchaHttpClient>().WithProxy();
 }

但是我看不到在哪里创建HttpClient对象:

var client = new HttpClient() // Where this is done?

如果我缺少某些东西,有人可以帮助我理解这一点吗?

Nop Commerce版本= 4.20

2 个答案:

答案 0 :(得分:1)

来自the documentation

  

将IHttpClientFactory和相关服务添加到IServiceCollection,并配置TClient类型和命名HttpClient之间的绑定。客户端名称将设置为TClient的类型名称。

services.AddHttpClient<CaptchaHttpClient>()经过粗略翻译,表示CaptchaHttpClientHttpClient有依赖性。这就是说,在将HttpClient注入CaptchaHttpClient时,不仅要创建一个新的-还要使用IHttpClientFactory的实现来提供一个并将其注入。

这意味着您没有管理HttpClient的生存期。 ServiceProvider正在幕后进行。

This documentation解释了它为什么存在以及它如何工作。

  

类型化客户端实际上是一个临时对象,这意味着每次需要一个新实例时都会创建一个实例,并且每次构造新实例时它将收到一个新的HttpClient实例。但是,池中的HttpMessageHandler对象是可以被多个Http请求重用的对象。

这意味着:

  • 您正在注册的东西-在这种情况下,CaptchaHttpClient是瞬态的,因此每次解析时,都会创建一个新实例。
  • 每次创建时,都会创建并注入一个新的HttpClient
  • 尽管HttpClient是新的,但它依赖的HttpMessageHandler被重用。

这使用了我们无需管理的HttpMessageHandler个实例池。我们的班级仅依靠HttpClient,而不必担心每次需要时创建/处置HttpClient时都会发生的负面影响。

答案 1 :(得分:0)

我发现this article有助于增进我对IHttpClientFactory模式的理解。

在您的ConfigureServices方法中定义类型化的客户端时, 类型服务已在临时范围内注册。这意味着 每当需要一个实例时,DI容器就会创建一个新实例。 发生这种情况的原因是将HttpClient实例注入到 类型化的客户端实例。 该HttpClient实例旨在 寿命短,这样HttpClientFactory可以确保 底层处理程序(和连接)被释放并回收。