gpt4 book ai didi

c# - 为集成测试创建默认的 HttpClientFactory

转载 作者:行者123 更新时间:2023-11-30 22:59:00 25 4
gpt4 key购买 nike

我有一个类型化的客户端,我想将其注册为单例:

public class SomeHttpClient
{
private readonly IHttpClientFactory _clientFactory;

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

public Task MakeSomeCallAsync(...)
{
var client = _clientFactory.Create();
// Do more stuff
}
}

类型化的客户端必须是单例,因为它有一些断路器逻辑,如果 API 对客户端进行速率限制,它就会断开电路。电路必须在整个应用程序中断开,显然不仅仅是当前的请求管道(否则客户端将继续访问已经受到其他实例速率限制的 API)。这已经通过使用封装该功能的类型化客户端实现(尽管不是 Polly)。

现在因为有类型的客户端将是一个单例,我们不能注入(inject)单个 HttpClient因为那会带来我们以前单例长寿时遇到的所有问题HttpClient .显而易见的解决方案是注入(inject) HttpClientFactory现在可用于发出 HttpClient每次类型化的客户端需要一个实例而不必担心生命周期管理等,因为这已被推迟到 HttpClientFactory现在。

我现在的问题是如何创建一个默认的 HttpClientFactory对于一个简单的功能集成测试,我想在其中实例化一个类型化的客户端,看看我是否可以访问 API 并从自动化测试中获得成功的响应?

我不想设置一个 ASP.NET Core TestServer 和围绕它的整个应用程序,因为这对于我现在想做的那种功能测试来说有点矫枉过正。

没有可用于注入(inject) HttpClientFactory 的公共(public)构造函数?

最佳答案

这是一个实现,它将为每次调用返回一个新的 HttpClient 实例(正如接口(interface)契约指定的那样),但重新使用相同的 HttpMessageHandler(类似于什么真正的 HttpClientFactory 做的):

public sealed class DefaultHttpClientFactory : IHttpClientFactory, IDisposable
{
private readonly Lazy<HttpMessageHandler> _handlerLazy = new (() => new HttpClientHandler());

public HttpClient CreateClient(string name) => new (_handlerLazy.Value, disposeHandler: false);

public void Dispose()
{
if (_handlerLazy.IsValueCreated)
{
_handlerLazy.Value.Dispose();
}
}
}

关于c# - 为集成测试创建默认的 HttpClientFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52576394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com