相关疑难解决方法(0)

HttpClient 注入 Singleton

假设我们有这样的代码:

services.AddHttpClient();
services.AddSingleton<IMyService, MyService>();

...

public class MyService : IMyService
{
    public MyService(HttpClient httpClient)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

有一些问题(可能很愚蠢,但我只是想澄清一些事情):

  1. 它会用来HttpClientFactory创建 的实例吗HttpClient
  2. 我猜它会使用,HttpClientFactory但在这种情况下,DNS 更改会出现问题吗?

目前尚不清楚HttpMessageHandlers 是否会针对单例服务进行管理,以及是否应该对服务进行范围限制以获得HttpClientFactory使用的所有好处。

c# .net-core

11
推荐指数
1
解决办法
5753
查看次数

注入的 HttpClient 忽略 IHttpClientFactory 配置

我创建了一个自定义库,它会自动为依赖于HttpClient.

这是使用IServiceCollection扩展方法和类型化客户端方法来完成的。一个简化的例子:

public static IHttpClientBuilder SetUpFooServiceHttpClient(this IServiceCollection services)
{
    return services
            .AddHttpClient<FooService>()
            .AddPolicyHandler(GetRetryPolicy());
} 
Run Code Online (Sandbox Code Playgroud)

示例服务:

public class FooService
{
    private readonly HttpClient _client;

    // OPTION 1
    public FooService(HttpClient httpClient)
    {
        _client = httpClient;
    }

    // OPTION 2
    public FooService(IHttpClientFactory httpClientFactory)
    {
        _client = httpClientFactory.CreateClient(GetType().Name);
    }

    public void DoJob()
    {
         var test = _client.GetAsync("http://example.com");
    }
}
Run Code Online (Sandbox Code Playgroud)

从 DI 容器中获取服务(来自测试项目):

var services = new ServiceCollection();

services.SetUpFooServiceHttpClient();
        
services.AddSingleton<FooService>();

var fooService = services
                   .BuildServiceProvider()
                   .GetRequiredService<FooService>();

// Perform test
fooService.DoJob();
Run Code Online (Sandbox Code Playgroud)

注意:在这个测试项目中,我还添加了一个额外的模拟处理程序,因为我试图模拟 …

c# dependency-injection dotnet-httpclient polly

6
推荐指数
1
解决办法
1075
查看次数