При использовании services.AddHttpClient, где создается HttpClient? - PullRequest
0 голосов

Я пытаюсь понять, как HttpClient было реализовано для Captcha в Nop Commerce и ради тестируемости, как создание нового экземпляра 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 Commerce Version = 4.20

1 Ответ

1 голос
/ 31 мая 2019

Из документации :

Добавляет IHttpClientFactory и связанные службы к IServiceCollection и настраивает привязку между типом TClient и именованным HttpClient.В качестве имени клиента будет задано имя типа TClient.

Грубо говоря, services.AddHttpClient<CaptchaHttpClient>() означает, что CaptchaHttpClient зависит от HttpClient.Это говорит о том, что при внедрении HttpClient в CaptchaHttpClient не просто создайте новый - используйте реализацию IHttpClientFactory для его предоставления и введите это.

Это означает, что вы не управляетевремя жизни HttpClient.ServiceProvider делает это за кулисами.

В этой документации объясняется, почему это существует и как оно работает.

Типизированный клиент, по сути, является временным объектом, то есть создается новый экземпляркаждый раз, когда он нужен, и он будет получать новый экземпляр HttpClient каждый раз, когда он создается.Однако объекты HttpMessageHandler в пуле - это объекты, которые повторно используются несколькими запросами Http.

Это означает:

  • То, что вы регистрируете - в данном случаеCaptchaHttpClient является переходным процессом, поэтому при каждом разрешении создается новый экземпляр.
  • Каждый раз при создании создается и вводится новый HttpClient.
  • Хотя HttpClient является новым, HttpMessageHandler, от которого он зависит, используется повторно.

Используется пул HttpMessageHandler экземпляров, которыми мы не должны управлять.Наш класс зависит только от HttpClient, не беспокоясь о негативных побочных эффектах, которые возникают, когда мы создаем / располагаем HttpClient каждый раз, когда он нам нужен.

...