.net 在启动期间只使用一次API

s2j5cfk0  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(163)

在应用程序启动期间,我使用CarService类来检索数据。我只想这样做一次,结果List<Car>从那一点起对应用中的所有消费者都可用(使用DI),换句话说,我不想每次在控制器或服务中注入ICarService时调用CarService -> GetData,而是只调用一次。

public interface ICarService
{
   Task<List<Car>> GetData();
}

public class CarService : ICarService
{
   private readonly IHttpClientFactory _httpClientFactory;

   public CarService(IHttpClientFactory httpClientFactory)
   {
      _httpClientFactory = httpClientFactory;
   }

   public async Task<List<Car>> GetData()
   { 
      var client = _httpClientFactory.CreateClient();
      var req = new HttpRequestMessage(HttpMethod.Get, "https://localhost:5011/cars");        
      var res = await client.SendAsync(req);
      ...
      return data;
   }
}

Program.cs

services.AddSingleton<ICarService, CarService>();
services.AddHostedService<GetDataService>();

public class GetDataService : IHostedService
{
    public async Task StartAsync(CancellationToken cancellationToken)
    {
        var carService = _serviceScopeFactory.CreateScope().ServiceProvider
            .GetRequiredService<ICarService>();
        var data = carService.GetData();
        ...
    }    
}
cbjzeqam

cbjzeqam1#

如何像这样改变你的CarService:

public class CarService : ICarService
{
   private readonly IHttpClientFactory _httpClientFactory;
   private Task<List<Car>> _getDataTask = null;

   public CarService(IHttpClientFactory httpClientFactory)
   {
      _httpClientFactory = httpClientFactory;
   }

   public Task<List<Car>> GetData()
   { 
      // Add some synchronization code if needed (semaphore, lock, mutex...)
      _getDataTask = _getDataTask ?? GetDataImpl();
      return _getDataTask;
   }

   private async Task<List<Car>> GetDataImpl()
   { 
      var client = _httpClientFactory.CreateClient();
      var req = new HttpRequestMessage(HttpMethod.Get, "https://localhost:5011/cars");        
      var res = await client.SendAsync(req);
      ...
      return data;
   }
}

相关问题