1

设想

我正在尝试将我现有的更改HttpClientIHttpClientFactory. 当我验证现有代码时,它使用 using{...} 语句会导致问题,并在此处提及。所以我想到了实现单例 Http 客户端并找到了另一个与此相关的博客,它就在这里

从所有这些中,我了解到最好的一个是IHttpClientFactory在 .NET Core 中引入的。

实施计划

由于这个应用程序在 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 有什么不同吗?

请指教

4

1 回答 1

3

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;
于 2020-08-13T10:13:17.273 回答