这里有几件事要看,第一件事MyStaticObject
实际上需要是静态的吗?如果是这样,我建议将其注册为单例,以便您仍然可以利用依赖注入。完成此操作后,您可以IHttpClientFactory
从代码中注册并使用它。您的ConfigureServices
方法可能最终看起来像这样
public void ConfigureServices(IServiceCollection services)
{
//The base extension method registers IHttpClientFactory
services.AddHttpClient();
services.AddSingleton<IMySingletonObject, MySingletonObject>();
}
然后在你的消费类中,MySingletonObject
在这种情况下,你可以这样配置它
public class MySingletonObject
{
private readonly IHttpClientFactory _clientFactory;
public MySingletonObject(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task SomeMethodThatUsesTheClient()
{
var client = _clientFactory.CreateClient();
//use the client
}
}
这样做的原因是它IHttpClientFactory
为我们处理了生命周期和池问题。根据文档:
管理底层 HttpClientMessageHandler 实例的池和生命周期。自动管理避免了手动管理 HttpClient 生命周期时发生的常见 DNS(域名系统)问题。
这发生在您进行CreateClient
调用时,因此您希望使用客户端在代码中执行此操作,而不是在应用程序启动时执行此操作。
作为旁注,如果您根本不需要这个类是单例,您可以使用扩展services.AddHttpClient<IMyClass, MyClass>()
并将一个HttpClient
直接注入到类中。DI 容器将在幕后为您处理从工厂获取客户端。