为什么我们需要注册IHttpClientFactory?

时间:2020-01-15 10:55:53

标签: c# .net asp.net-core .net-core dependency-injection

这是文档https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1 我们可以看到IHttpClientFactory已注册:

services.AddHttpClient();

以及将其消耗为的模型类:

public BasicUsageModel(IHttpClientFactory clientFactory)
{
   _clientFactory = clientFactory;
}

public async Task OnGet()
{
   ...
   var client = _clientFactory.CreateClient();
   var response = await client.SendAsync(request);
   ...
}

但是我们不注册它,而只是为其创建一个新实例:

public async Task OnGet()
{
   ...
   var client = new HttpClient();
   var response = await client.SendAsync(request);
   ...
}

这样BasicUsageModel的构造函数不需要接受任何参数,并且在进行单元测试时,我不需要使用Moq来模拟它,是不是更好? >

对于第一种情况,如何在不实际发送请求的情况下模拟IHttpClientFactory来测试OnGet()

2 个答案:

答案 0 :(得分:0)

当进行单元测试时,我不需要使用Moq来模拟它,那再好不过了

不,不是。 unit 测试的全部要点是在没有依赖关系的情况下测试该单元。在这种情况下,没有实际的服务器可以连接。

假设您有一个针对客户端实际获取数据的单元测试,以及针对一个客户端未能获取数据的单元测试,那么您将无法用自己的方式合理地做到这一点。

需要对其进行模拟,以便能够针对您的http调用的不同结果提供多个​​测试用例。

答案 1 :(得分:0)

除了已经提到的UnitTesting点之外,链接的文档还指定了使用IHttpClientFactory而不是直接将新的HttpClient实例化的主要原因之一。

管理基础HttpClientMessageHandler实例的池化和生存期。自动管理避免了手动管理HttpClient生存期时出现的常见DNS(域名系统)问题。

相关问题