IHttpClientFactory Singleton .NET Framework

问题描述

场景

我正在尝试将现有的HttpClient更改为IHttpClientFactory。当我验证现有代码时,使用using {...}语句会引起问题,并提到here。因此,我想到实现单例Http客户端,并到达了与此相关的另一个博客,它是here

从所有这些方面,我了解到最好的方法是.NET Core中引入的IHttpClientFactory

实施计划

由于此应用程序在ASP.NET MVC 4中并且不使用DI,因此我必须做一些没有DI框架的事情。根据我的搜索,从StackOverflow得到了答案,并计划实现相同的方法。同时,我还有另一个项目,该项目已经删除了所有依赖项,并且可以在不做任何事情的情况下用于较早的项目。仓库是HttpClientFactoryLite

问题

现在我可以通过初始化此类来使用HttpClientFactoryLite吗?该描述还提到它可以与现有的DI框架一起使用,以便ClientFactory可以注册为单例。请从自述文件中找到措辞

using HttpClientFactoryLite;

var httpClientFactory = new HttpClientFactory(); //bliss

如果使用依赖项注入,请确保IHttpClientFactory已注册为单例。

在我的场景中,我没有添加任何DI框架。所以我将在需要的地方初始化工厂。在这里我很困惑,两件事

  1. 是否有必要为HttpClientFactoryLite创建单例类?

  2. HttpClientFactory类如何处置?是否需要将其作为控制器的一部分或使用using语句等进行处理?

  3. 基于this的回答,Microsoft.Extensions.Http仅提供HttpClientFactory,而不提供新的优化的HttpClient。仅在.NET Core 2.1中可用。那么在实现IHttpClientFactory方面有何不同?

请告知

解决方法

ASP.NET 3.1:

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddSingleton<IHttpClientFactory,HttpClientFactory>();
}

ASP.NET将自动将正确的单例传递给在其构造函数中需要IHttpClientFactory的控制器。


没有DI容器的Poormans变化:

public static class Singleton<TInterface> 
{
    private static TInterface instance;
    public static TInterface Instance
    { 
        get => instance;
        private set => instance ??= value;
    }

    public static void Add<TConcrete>() where TConcrete : TInterface,new()
        => Instance = new TConcrete();

    public static void Add<TConcrete>(TConcrete instance) where TConcrete : TInterface
        => Instance = instance;

    // put dispose logic if necessary
}

用法:

// Application Entrypoint
Singleton<IHttpClientFactory>.Add<HttpClientFactory>();

// Class/Controller Property
private readonly IHttpClientFactory httpClientFactory 
    = Singleton<IHttpClientFactory>.Instance;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...