c# - IHttpClientFactory 单例 .NET 框架
问题描述
设想
我正在尝试将我现有的更改HttpClient
为IHttpClientFactory
. 当我验证现有代码时,它使用 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 框架。所以我要在需要的地方初始化工厂。在这里,我对两件事感到困惑
是否有必要为 做一个单例类
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;
推荐阅读
- python - 网络共享上的中央 Python 第三方包库
- python - 图像中旋转和相交字符的文本识别
- regex - 使用 VBA RegEx 即时更改公式
- javascript - 你们在部署时会缩小 node.js 吗?
- c++ - 获取用 C/C++ 打印的最后一个字符串
- php - PHP - Predis 连接超时
- java - 在服务层使用 DTO 是一种好习惯吗?
- java - 为什么我的方法会覆盖数组中的位置
- flutter - 在 Flutter 中使用 FilePicker 设置最大文件大小
- amazon-web-services - AWS Hadoop MapReduce - 平均字数