c# - 使用 services.AddHttpClient 时,HttpClient 是在哪里创建的?
问题描述
我试图了解如何HttpClient
在 Nop Commerce 中为 Captcha 实施,以及为了可测试性,如何HttpClient
在 Nop Commerce 项目中管理创建新实例。
我遇到了ValidateCaptchaAttribute
,ValidateCaptchaFilter
我看到 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
解决方案
从文档中:
将 IHttpClientFactory 和相关服务添加到 IServiceCollection 并配置 TClient 类型和命名 HttpClient 之间的绑定。客户端名称将设置为 TClient 的类型名称。
粗略翻译,services.AddHttpClient<CaptchaHttpClient>()
意味着CaptchaHttpClient
依赖于HttpClient
. 这表示当注入 时HttpClient
,CaptchaHttpClient
不要只是创建一个新的 - 使用实现IHttpClientFactory
来提供一个并注入它。
这意味着您没有管理HttpClient
. 他们ServiceProvider
在幕后做这件事。
本文档解释了它为什么存在以及它是如何工作的。
Typed Client 实际上是一个临时对象,这意味着每次需要一个新实例时都会创建一个新实例,并且每次构造它时都会接收一个新的 HttpClient 实例。但是,池中的 HttpMessageHandler 对象是被多个 Http 请求重用的对象。
这表示:
- 您正在注册的东西 - 在这种情况下
CaptchaHttpClient
是暂时的,因此每次解决它时,都会创建一个新实例。 - 每次创建时,
HttpClient
都会创建并注入一个新的。 - 虽然
HttpClient
是新的,但HttpMessageHandler
它所依赖的被重用了。
这使用了HttpMessageHandler
我们不必管理的实例池。我们的类只依赖于,HttpClient
而不必担心HttpClient
每次需要时创建/处置 an 时会发生的负面影响。
推荐阅读
- excel - Excel中的索引匹配多个条件,查看部分匹配
- javascript - 如何在点击字符之前获取文本?
- haskell - 如何以一种完整而优雅的方式使用固定最小长度列表?
- pascal - 对 Pascal 语法感到困惑
- applescript - AppleScript 和 wget
- python - Flask 中的 DB 连接池应该在哪里初始化?
- r - 计算索引给定的两列之间的行中的唯一实例
- angular - 在 Angualr 8 中激活或停用命名路由器插座时,如何防止页面跳转到顶部?
- ios - 找不到flutter_blue^0.6.3 文件#import "google/protobuf/Any.pbobjc.h" Flutter
- python-3.x - 在 python 中写入 /proc/net/xt_recent/