web-dev-qa-db-fra.com

Injection de dépendances: HttpClient ou HttpClientFactory?

Partout, je peux voir trois approches principales pour créer des clients (basiques, nommés, tapés) en DI, mais je n'ai trouvé nulle part où injecter IHttpClientFactory ou HttpClient (les deux possibles).

Q1: Quelle est la différence entre l'injection de IHttpClientFactory ou HttpClient s'il vous plaît?

Q2: Et si IHttpClientFactory est injecté, dois-je utiliser factory.CreateClient() pour chaque appel?

6
procma

Résumé

  • HttpClient ne peut être injecté qu'à l'intérieur Typed clients
  • pour d'autres usages, vous avez besoin de IHttpClientFactory
  • Dans les deux scénarios, la durée de vie de HttpClientMessageHandler est gérée par le framework, vous ne vous inquiétez donc pas de la suppression (incorrecte) du HttpClients.

Exemples

Afin d'injecter directement HttpClient, vous devez enregistrer un service Typed spécifique qui recevra le client:

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

Maintenant, nous pouvons l'injecter dans le typé GithubClient

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

Vous ne pouvez pas injecter le HttpClient à l'intérieur de AnotherClient, car il n'est pas tapé à AnotherClient

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

Vous pouvez cependant:
1. Injectez le IHttpClientFactory et appelez CreateClient(). Ce client aura BaseAddress défini sur null.
2. Ou configurez AnotherClient comme un client typé différent avec, par exemple, un BaseAdress différent.

Mettre à jour

Sur la base de votre commentaire, vous enregistrez un client Named. Il est toujours résolu à partir de la méthode IHttpClientFactory.CreateClient (), mais vous devez passer le 'nom' du client

Inscription

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

tilisation

// 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"
}
2
edo.n

Malheureusement, je ne peux pas commenter, mais seulement publier une réponse. Par conséquent, je vous suggère de consulter les liens suivants:

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/

En ce qui concerne vos questions, cela se résume plus ou moins à ceci:

Q1 -> IHttpClientFactory gère les pools de connexions des instances HttpClient et cela vous aidera à résoudre les problèmes de chargement et d'élimination tels que décrits dans les liens, si HttpClient est utilisé faux.

Q2 -> oui, vous devez utiliser le client factory.create selon les documents Microsoft

1
Dominik Sand