Внедрение зависимостей: HttpClient или HttpClientFactory? - PullRequest
1 голос
/ 11 декабря 2019

Везде я вижу три основных подхода к созданию клиентов (базовый, именованный, типизированный) в DI, но я нигде не нашел, если ввести IHttpClientFactory или HttpClient (оба возможны).

Q1 : В чем разница между инъекциями IHttpClientFactory или HttpClient, пожалуйста?

Q2 : И если IHttpClientFactory вводится, я должен использовать factory.CreateClient() для каждого вызова?

Ответы [ 2 ]

1 голос
/ 11 декабря 2019

К сожалению, я не могу комментировать, но только опубликовать ответ. Поэтому я предлагаю вам проверить следующие ссылки:

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

Что касается ваших вопросов, то это в большей или меньшей степени сводится к следующему:

Q1 -> IHttpClientFactory обрабатывает пулы соединений экземпляров HttpClient, и это поможет вам при загрузке и устранении проблем, описанных в ссылках, если HttpClient используется неправильно.

Q2 -> да, вы должны использовать factory.create клиент в соответствии с документами Microsoft

1 голос
/ 11 декабря 2019

Сводка

  • HttpClient можно вводить только внутрь Типизированные клиенты
  • для других целей, вам необходимо IHttpClientFactory
  • В обоих сценариях время жизни HttpClientMessageHandler управляется платформой, поэтому вас не беспокоит (неправильно) утилизация HttpClients.

Примеры

Для того, чтобынепосредственно введите HttpClient, вам нужно зарегистрировать определенную типизированную службу, которая будет получать клиент:

services.AddHttpClient<GithubClient>(c => c.BaseAddress = new System.Uri("https://api.github.com"));

Теперь мы можем внедрить это внутри , набранного GithubClient

public class GithubClient
{
    public GithubClient(HttpClient client)
    {
        // client.BaseAddress is "https://api.github.com"
    }
}

Вы не можете ввести HttpClient внутрь AnotherClient, потому что не набирается до AnotherClient

public class AnotherClient
{
    public AnotherClient(HttpClient client)
    {
        // InvalidOperationException, can't resolve HttpClient 
    }
}

Вы можете,однако:
1. Введите IHttpClientFactory и позвоните CreateClient(). У этого клиента будет BaseAddress, установленный на null.
2. Или настроить AnotherClient как другой типизированный клиент с, например, другим BaseAdress.

Обновлением

На основании вашего комментария вы регистрируете клиента Named . Он все еще разрешается с помощью метода IHttpClientFactory.CreateClient (), но вам необходимо передать «имя» клиента

Регистрация

services.AddHttpClient("githubClient", c => c.BaseAddress = new System.Uri("https://api.github.com"));

Использование

// note that we inject IHttpClientFactory
public HomeController(IHttpClientFactory factory)
{
    this.defaultClient = factory.CreateClient(); // BaseAddress: null
    this.namedClient = factory.CreateClient("githubClient"); // BaseAddress: "https://api.github.com"
}
...