我试图了解如何在Nop Commerce中为验证码实施HttpClient
,并且为了可测试性,如何在Nop Commerce项目中管理创建HttpClient
的新实例。
我遇到了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 Commerce版本= 4.20
答案 0 :(得分:1)
将IHttpClientFactory和相关服务添加到IServiceCollection,并配置TClient类型和命名HttpClient之间的绑定。客户端名称将设置为TClient的类型名称。
services.AddHttpClient<CaptchaHttpClient>()
经过粗略翻译,表示CaptchaHttpClient
对HttpClient
有依赖性。这就是说,在将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可以确保 底层处理程序(和连接)被释放并回收。