c# - 范围服务 - 每个请求是否相同?感觉我的代码中使用了多个副本
问题描述
我有一个范围服务:
public class GetLatestStatus:IGetLatestStatus{
private HttpClient _httpClient;
private readonly int _status;
public GetLatestStatus(HttpClient httpClient){
_httpClient = httpClient;
_date= GetStatusFromService();
}
public string GetStatus(){
return _status;
}
private string GetStatusFromService(){
Logger.Info($"Calling service...");
var request = new HttpGetRequest{Url = "http://some.service/get/status"};
var result = _httpClient.Get(request).Result;
return result.Status;
}
}
以下是它在启动时的定义:
public virtual void ConfigureServices(IServiceCollection services){
services.AddScoped<IGetLatestStatus, GetLatestStatus>()
.AddHttpClient<IGetLatestStatus, GetLatestStatus>();
services.AddTransient<ISomeClass1, SomeClass1>();
services.AddTransient<ISomeClass2, SomeClass2>();
services.AddTransient<ISomeClass3, SomeClass3>();
}
它被三个瞬态类使用。
此类的意图是 _status 仅在请求进入时定义一次。然后在请求的整个生命周期中存储它。
相反,当请求第一次进来时,似乎 GetStatusFromService() 被调用了三次,每个瞬态类一次。
我如何使这门课按我的预期工作?我认为将某些东西定义为范围服务意味着请求的生命周期只有一个副本。谢谢大家的帮助!
解决方案
TL:博士
发生这种情况是因为您GetLatestStatus
在范围注册后这样注册.AddHttpClient<IGetLatestStatus, GetLatestStatus>();
因此可以创建另一个类来存储状态并将其注册为作用域。然后使用 Http Configured 服务从它到达服务
根据 MSDN;
要配置上述结构,请通过安装包含 IServiceCollection 的 AddHttpClient() 扩展方法的 Microsoft.Extensions.Http NuGet 包,在应用程序中添加 HttpClientFactory。此扩展方法注册 DefaultHttpClientFactory 以用作接口 IHttpClientFactory 的单例。它为 HttpMessageHandlerBuilder 定义了一个临时配置。此消息处理程序(HttpMessageHandler 对象)取自池,由工厂返回的 HttpClient 使用。
推荐阅读
- python - 使用 SHA512 散列时,散列与字典不匹配。我错过了什么?
- php - 如何通过openshift部署laravel项目
- c - 现在我该怎么做?
- reactjs - 我需要做什么才能在 api 中接收我的表单数据?
- java - Java的编译器和解释器(JVM)
- php - 找不到 DB Seeder 类
- visual-c++ - 如何通过 CPUID 命令使用 C/C++ 获取物理和虚拟地址位
- java - 如何更改android中按钮的背景?
- quickbase - Quickbase API 调用的问题
- c++ - 为什么使用 vecS 作为 OutEdgeList 模板参数的 boost adjacency_list 在遍历时会使边无效?