diff --git a/AsbCloudInfrastructure/CacheExtentions.cs b/AsbCloudInfrastructure/CacheExtentions.cs new file mode 100644 index 00000000..28e791e9 --- /dev/null +++ b/AsbCloudInfrastructure/CacheExtentions.cs @@ -0,0 +1,44 @@ +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure +{ + public static class MemoryCacheExtentions + { + private static readonly TimeSpan CacheOlescence = TimeSpan.FromMinutes(5); + + public static Task> GetOrCreateBasicAsync(this IMemoryCache memoryCache, IAsbCloudDbContext dbContext, CancellationToken token) + where T : class + { + var cacheTag = typeof(T).FullName; + var cache = memoryCache.GetOrCreateAsync(cacheTag, async (cacheEntry) => { + cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; + cacheEntry.SlidingExpiration = CacheOlescence; + + var entities = await dbContext.Set().ToArrayAsync(token); + return entities.AsEnumerable(); + }); + return cache; + } + + public static IEnumerable GetOrCreateBasic(this IMemoryCache memoryCache, IAsbCloudDbContext dbContext) + where T : class + { + var cacheTag = typeof(T).FullName; + var cache = memoryCache.GetOrCreate(cacheTag, cacheEntry => { + cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; + cacheEntry.SlidingExpiration = CacheOlescence; + + var entities = dbContext.Set().ToArray(); + return entities.AsEnumerable(); + }); + return cache; + } + } +} diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs index f8574152..b2e15216 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryService.cs @@ -17,7 +17,7 @@ namespace AsbCloudInfrastructure.Services.SAUB #nullable enable public class TelemetryService : ITelemetryService { - private const string telemetryCacheTag = "telemetryCache"; + private const string CacheTag = "TelemetryCache"; private static readonly TimeSpan telemetryCacheObsolescence = TimeSpan.FromMinutes(5); private readonly IAsbCloudDbContext db; @@ -39,15 +39,15 @@ namespace AsbCloudInfrastructure.Services.SAUB private IEnumerable GetTelemetryCache() { - var cache = db.Telemetries + var cache = db.Set() .Include(t => t.Well) - .FromCache(telemetryCacheTag, telemetryCacheObsolescence); + .FromCache(CacheTag, telemetryCacheObsolescence); return cache; } private void DropTelemetryCache() { - db.Telemetries.DropCache(telemetryCacheTag); + db.Telemetries.DropCache(CacheTag); } public DateTime GetLastTelemetryDate(int idTelemetry) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryTracker.cs index 99dce9d6..b6104e57 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryTracker.cs @@ -3,6 +3,7 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.Cache; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using System; using System.Collections.Concurrent; @@ -39,14 +40,14 @@ namespace AsbCloudInfrastructure.Services.SAUB private readonly ConcurrentDictionary telemetriesStats; - public TelemetryTracker(CacheDb cacheDb, IConfiguration configuration) + public TelemetryTracker(IConfiguration configuration, IMemoryCache memoryCache) { var contextOptions = new DbContextOptionsBuilder() .UseNpgsql(configuration.GetConnectionString("DefaultConnection")) .Options; var db = new AsbCloudDbContext(contextOptions); - var cacheTelemetry = cacheDb.GetCachedTable(db); + var cacheTelemetry = memoryCache.GetOrCreateBasic(db); var keyValuePairs = new Dictionary(cacheTelemetry.Count()); foreach (var telemetry in cacheTelemetry) {