问题描述
场景
我正在尝试将现有的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框架。所以我将在需要的地方初始化工厂。在这里我很困惑,两件事
-
是否有必要为
HttpClientFactoryLite
创建单例类? -
该
HttpClientFactory
类如何处置?是否需要将其作为控制器的一部分或使用using语句等进行处理? -
基于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;