Dependency injection: HttpClient or HttpClientFactory?

拈花ヽ惹草 提交于 2020-08-02 07:36:31

问题


Everywhere I can see three main approaches to create clients (basic, named, typed) in DI, but I have found nowhere if to inject IHttpClientFactory or HttpClient (both possible).

Q1: What is the difference between injecting IHttpClientFactory or HttpClient please?

Q2: And if IHttpClientFactory is injected, should I use factory.CreateClient() for each call?


回答1:


Summary

  • HttpClient can only be injected inside Typed clients
  • for other usages, you need IHttpClientFactory
  • In both scenarios, the lifetime of HttpClientMessageHandler is managed by the framework, so you are not worried about (incorrectly) disposing the HttpClients.

Examples

In order to directly inject HttpClient, you need to register a specific Typed service that will receive the client:

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

Now we can inject that inside the typed GithubClient

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

You can't inject the HttpClient inside AnotherClient, because it is not typed to AnotherClient

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

You can, however:
1. Inject the IHttpClientFactory and call CreateClient(). This client will have BaseAddress set to null.
2. Or configure AnotherClient as a different typed client with, for example, a different BaseAdress.

Update

Based on your comment, you are registering a Named client. It is still resolved from the IHttpClientFactory.CreateClient() method, but you need to pass the 'name' of the client

Registration

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

Usage

// 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:


Sadly I cannot comment, but only Post an answer. Therefore I suggest you should check out the following Links:

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/

Regarding your Questions it more or Less boils down to this:

Q1 -> IHttpClientFactory handles the connection pools of HttpClient instances and this will help you regarding load and dispose problems as discribed in the links, if the HttpClient is used wrong.

Q2 -> yes you should use factory.create client according to microsoft docs



来源:https://stackoverflow.com/questions/59280153/dependency-injection-httpclient-or-httpclientfactory

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!