using AS1024.GeoFeed.Core.Interfaces; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace AS1024.GeoFeed.Core.CacheService { public class GeoFeedCacheService : IHostedService { private readonly ILogger logger; private readonly IGeoFeedProvider feedProvider; private readonly IHost host; public GeoFeedCacheService(ILogger logger, IGeoFeedProvider feedProvider, IHost host) { this.logger = logger; this.feedProvider = feedProvider; this.host = host; } public Task StartAsync(CancellationToken cancellationToken) { _ = StartPerioidicSync(cancellationToken); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } public async Task StartPerioidicSync(CancellationToken Token) { while (!Token.IsCancellationRequested) { try { var scope = host.Services.CreateScope(); var persistentCacheProvider = scope.ServiceProvider.GetRequiredService(); var results = await feedProvider.GetGeoFeedDataAsync(); await persistentCacheProvider.CacheGeoFeed(results); } catch (Exception) { logger.LogWarning("On disk cache failed to run. Waiting on 30 minutes before retry..."); } await Task.Delay(TimeSpan.FromMinutes(30)); } return false; } } }