首页 > 解决方案 > 范围服务 - 每个请求是否相同?感觉我的代码中使用了多个副本

问题描述

我有一个范围服务:

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() 被调用了三次,每个瞬态类一次。

我如何使这门课按我的预期工作?我认为将某些东西定义为范围服务意味着请求的生命周期只有一个副本。谢谢大家的帮助!

标签: c#.net-coredependency-injection

解决方案


TL:博士

发生这种情况是因为您GetLatestStatus在范围注册后这样注册.AddHttpClient<IGetLatestStatus, GetLatestStatus>();

因此可以创建另一个类来存储状态并将其注册为作用域。然后使用 Http Configured 服务从它到达服务


根据 MSDN;

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

请查看链接以获取更多信息https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests


推荐阅读