使用netstandard2.0库中的HttpClientFactory而不访问ServicesCollection



W有一个项目,该项目以Nuget包的形式交付,该包被集成为供我们系统中的其他应用程序使用。这个想法是库提供了一组服务,并公开了Autofac扩展方法public static ContainerBuilder UseMyLibrary(this ContainerBuilder builder)。现在,这种设计早于移植我们的应用程序do.net核心,但我们保留了Autofac配置,因此消费者应用程序使用Autofac/ServiceCollection集成。现在,我们需要我们的库来执行HTTP调用,所以我们想要使用HttpClientFactory。但正如我在文档中所读到的那样,为了使用一个,我们需要在库中无法访问的ServiceCollection上调用AddHttpClient();,因此需要使用者(通常是ASP.NET Core应用程序)在Startup.ConfigureServices中调用它。有没有一种方法可以在我们的public static ContainerBuilder UseMyLibrary(this ContainerBuilder builder)方法中确认HttpClientFactory?`

不幸的是,Microsoft的DefaultHttpClientFactory是一个内部类,并且与Microsoft的DI(与IHttpClientFactory)紧密耦合。。

对于替代方案,您可以从Microsoft的文档中查看:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-ihttpclientfactory 的5.0#替代方案

因此,您实际上可以使用SocketsHttpHandler类自己创建一个简单的工厂,下面是一个示例:

public static class HttpClientFactory
{
static SocketsHttpHandler SocketsHttpHandler;
static HttpClientFactory()
{
SocketsHttpHandler = new SocketsHttpHandler();
}
public static HttpClient CreateClient()
{
return new HttpClient(SocketsHttpHandler, false);
}
}

使用静态类将确保在应用程序的整个生命周期内使用单个SocketsHttpHandler,而无需担心使用双重锁检查等创建线程安全的单例。

最新更新