首页 > 解决方案 > 使用 services.AddHttpClient 时,HttpClient 是在哪里创建的?

问题描述

我试图了解如何HttpClient在 Nop Commerce 中为 Captcha 实施,以及为了可测试性,如何HttpClient在 Nop Commerce 项目中管理创建新实例。

我遇到了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 商务版 = 4.20

标签: c#asp.net-core-mvcnopcommerce

解决方案


文档中

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

粗略翻译,services.AddHttpClient<CaptchaHttpClient>()意味着CaptchaHttpClient依赖于HttpClient. 这表示当注入 时HttpClientCaptchaHttpClient不要只是创建一个新的 - 使用实现IHttpClientFactory来提供一个并注入它。

这意味着您没有管理HttpClient. 他们ServiceProvider在幕后做这件事。

本文档解释了它为什么存在以及它是如何工作的。

Typed Client 实际上是一个临时对象,这意味着每次需要一个新实例时都会创建一个新实例,并且每次构造它时都会接收一个新的 HttpClient 实例。但是,池中的 HttpMessageHandler 对象是被多个 Http 请求重用的对象。

这表示:

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

这使用了HttpMessageHandler我们不必管理的实例池。我们的类只依赖于,HttpClient而不必担心HttpClient每次需要时创建/处置 an 时会发生的负面影响。


推荐阅读