Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作用域服务-每个请求的副本是否相同?感觉我的代码中使用了多个副本_C#_.net Core_Dependency Injection - Fatal编程技术网

C# 作用域服务-每个请求的副本是否相同?感觉我的代码中使用了多个副本

C# 作用域服务-每个请求的副本是否相同?感觉我的代码中使用了多个副本,c#,.net-core,dependency-injection,C#,.net Core,Dependency Injection,我有一个作用域服务: public class GetLatestStatus:IGetLatestStatus{ private HttpClient _httpClient; private readonly int _status; public GetLatestStatus(HttpClient httpClient){ _httpClient = httpClient; _date= GetStatusFromService();

我有一个作用域服务:

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:DR

发生这种情况的原因是,在作用域注册之后,像这样注册GetLatestStatus

因此,您可以创建另一个类来存储状态并将其注册为作用域。然后使用Http配置的服务从中访问服务

根据MSDN

要配置上述结构,请通过安装Microsoft.Extensions.Http NuGet包在应用程序中添加HttpClientFactory,该包包含IServiceCollection的AddHttpClient扩展方法。此扩展方法注册DefaultHttpClientFactory,以用作接口IHttpClientFactory的单例。它定义了HttpMessageHandlerBuilder的瞬态配置。此消息处理程序HttpMessageHandler对象取自池,由工厂返回的HttpClient使用


请查看链接以了解更多信息

是的,只有一个实例。但该实例由三个类使用。如果在一个请求中使用了这三个类,那么它们都将调用该方法。当然,您只能在GetLatestStatus中运行一次请求,然后从缓存中返回结果。@我为什么他们都要调用该方法?它在作用域实例的构造函数中调用。我希望它能像OP didYeah一样工作抱歉,我忽略了它只是从ctor打过来的。忽略我的评论。