假设我们有这样的代码:
services.AddHttpClient();
services.AddSingleton<IMyService, MyService>();
...
public class MyService : IMyService
{
public MyService(HttpClient httpClient)
{
}
}
Run Code Online (Sandbox Code Playgroud)
有一些问题(可能很愚蠢,但我只是想澄清一些事情):
HttpClientFactory创建 的实例吗HttpClient?HttpClientFactory但在这种情况下,DNS 更改会出现问题吗?目前尚不清楚HttpMessageHandlers 是否会针对单例服务进行管理,以及是否应该对服务进行范围限制以获得HttpClientFactory使用的所有好处。
我创建了一个自定义库,它会自动为依赖于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)
注意:在这个测试项目中,我还添加了一个额外的模拟处理程序,因为我试图模拟 …