From 1c91c31417196ef6be1185fdf3b8bd2f7c42aafa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Thu, 11 Nov 2021 10:57:08 +0500 Subject: [PATCH] Refactor CacheDb. replace tuple by private class --- .../Services/Cache/CacheDb.cs | 23 ++++++------------ .../Services/Cache/CacheTable.cs | 24 +++++++++---------- .../Services/Cache/CacheTableDataStore.cs | 15 ++++++++++++ .../Services/TelemetryService.cs | 6 ++--- .../WellOperationsStatService.cs | 4 ++-- 5 files changed, 39 insertions(+), 33 deletions(-) create mode 100644 AsbCloudInfrastructure/Services/Cache/CacheTableDataStore.cs diff --git a/AsbCloudInfrastructure/Services/Cache/CacheDb.cs b/AsbCloudInfrastructure/Services/Cache/CacheDb.cs index 4ff07154..f4624b68 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheDb.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheDb.cs @@ -1,6 +1,4 @@ using Microsoft.EntityFrameworkCore; -using System; -using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; @@ -9,25 +7,18 @@ namespace AsbCloudInfrastructure.Services.Cache public class CacheDb { - private readonly ConcurrentDictionary cache = - new ConcurrentDictionary(); - - private readonly TimeSpan obsolesenceTime = TimeSpan.FromMinutes(15); + private readonly ConcurrentDictionary cache = + new ConcurrentDictionary(); public CacheTable GetCachedTable(DbContext context) where TEntity : class { - var entityTypeName = typeof(TEntity).FullName; - - var cacheItem = cache.GetOrAdd(entityTypeName, (DateTime.Now, new List())); - - bool isCachedDataObsolete = DateTime.Now - cacheItem.Item1 > obsolesenceTime; - + var nameOfTEntity = typeof(TEntity).FullName; + var cacheItem = cache.GetOrAdd(nameOfTEntity, (nameOfTEntity) => new CacheTableDataStore { + NameOfTEntity = nameOfTEntity, + Entities = new List(), + }); var tableCache = new CacheTable(context, cacheItem); - - if (isCachedDataObsolete) - tableCache.Refresh(true); - return tableCache; } diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index 528f09d2..c87c2919 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -14,21 +14,21 @@ namespace AsbCloudInfrastructure.Services.Cache { private const int semaphoreTimeout = 5_000; private static readonly SemaphoreSlim semaphore = new(1); - private static readonly TimeSpan minPeriodRefresh = TimeSpan.FromSeconds(5); + private static readonly TimeSpan minPeriodRefresh = TimeSpan.FromSeconds(5); private static readonly string nameOfTEntity = typeof(TEntity).Name; - private readonly DbContext context; - private (DateTime refreshDate, IEnumerable entities) data; + private readonly CacheTableDataStore data; private readonly List cached; + private readonly DbContext context; private readonly DbSet dbSet; - internal CacheTable(DbContext context, (DateTime refreshDate, IEnumerable entities) data) + internal CacheTable(DbContext context, CacheTableDataStore data) { this.context = context; this.data = data; dbSet = context.Set(); - cached = (List)data.entities; - if (cached.Count == 0) + cached = (List)data.Entities; + if ((cached.Count == 0)||data.IsObsolete) Refresh(false); } @@ -52,7 +52,7 @@ namespace AsbCloudInfrastructure.Services.Cache } catch (Exception ex) { - Trace.WriteLine($"{DateTime.Now:yyyy.MM.dd HH:mm:ss:fff} error in CacheTable<{typeof(TEntity).Name}>.Sync()"); + Trace.WriteLine($"{DateTime.Now:yyyy.MM.dd HH:mm:ss:fff} error in CacheTable<{nameOfTEntity}>.Sync()"); Trace.WriteLine(ex.Message); Trace.WriteLine(ex.StackTrace); } @@ -81,7 +81,7 @@ namespace AsbCloudInfrastructure.Services.Cache } catch (Exception ex) { - Trace.WriteLine($"{DateTime.Now:yyyy.MM.dd HH:mm:ss:fff} error in CacheTable<{typeof(TEntity).Name}>.SyncAsync()"); + Trace.WriteLine($"{DateTime.Now:yyyy.MM.dd HH:mm:ss:fff} error in CacheTable<{nameOfTEntity}>.SyncAsync()"); Trace.WriteLine(ex.Message); Trace.WriteLine(ex.StackTrace); } @@ -94,26 +94,26 @@ namespace AsbCloudInfrastructure.Services.Cache private void InternalRefresh(bool force) { - if (force || data.refreshDate + minPeriodRefresh > DateTime.Now) + if (force || data.LastResreshDate + minPeriodRefresh < DateTime.Now) { cached.Clear(); var entities = dbSet.AsNoTracking().ToList(); Trace.WriteLine($"CacheTable<{nameOfTEntity}> refresh"); cached.AddRange(entities); - data.refreshDate = DateTime.Now; + data.LastResreshDate = DateTime.Now; } } private async Task InternalRefreshAsync(bool force, CancellationToken token = default) { - if (force || data.refreshDate + minPeriodRefresh > DateTime.Now) + if (force || data.LastResreshDate + minPeriodRefresh < DateTime.Now) { cached.Clear(); var entities = await context.Set().AsNoTracking() .ToListAsync(token).ConfigureAwait(false); Trace.WriteLine($"CacheTable<{nameOfTEntity}> refreshAsync"); cached.AddRange(entities); - data.refreshDate = DateTime.Now; + data.LastResreshDate = DateTime.Now; } } diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTableDataStore.cs b/AsbCloudInfrastructure/Services/Cache/CacheTableDataStore.cs new file mode 100644 index 00000000..be9dfcf8 --- /dev/null +++ b/AsbCloudInfrastructure/Services/Cache/CacheTableDataStore.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections; + +namespace AsbCloudInfrastructure.Services.Cache +{ + class CacheTableDataStore + { + public string NameOfTEntity { get; set; } + public DateTime LastResreshDate { get; set; } + public IEnumerable Entities { get; set; } + public TimeSpan ObsolesenceTime { get; set; } = TimeSpan.FromMinutes(15); + public bool IsObsolete => (DateTime.Now - LastResreshDate > ObsolesenceTime); + + } +} diff --git a/AsbCloudInfrastructure/Services/TelemetryService.cs b/AsbCloudInfrastructure/Services/TelemetryService.cs index 3502a766..5bf4a11a 100644 --- a/AsbCloudInfrastructure/Services/TelemetryService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryService.cs @@ -143,7 +143,7 @@ namespace AsbCloudInfrastructure.Services var telemetriesSrcIdsSql = $"({string.Join(',', telemetriesSrcIds)})"; - var telemetryInfoAndUid = telemetriesGrade + var (RemoteUid, Info) = telemetriesGrade .Where(t => t.Info != null) .OrderByDescending(t => t.Id) .Select(t => (t.RemoteUid, t.Info)) @@ -164,8 +164,8 @@ namespace AsbCloudInfrastructure.Services try { var telemetryDst = db.Telemetries.FirstOrDefault(t => t.Id == telemetryDestId); - telemetryDst.RemoteUid = telemetryInfoAndUid.RemoteUid; - telemetryDst.Info = telemetryInfoAndUid.Info; + telemetryDst.RemoteUid = RemoteUid; + telemetryDst.Info = Info; if (wellId != default) { diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationsStatService.cs index 8a16358d..d819d7c1 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationsStatService.cs @@ -101,7 +101,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService { Id = well.Id, Caption = well.Caption, - WellType = wellType.Caption, + WellType = wellType?.Caption ?? "", IdState = well.IdState, State = wellService.GetStateText(well.IdState), LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id), @@ -384,7 +384,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService return tvd; } - private List> MergeArraysBySections( + private static List> MergeArraysBySections( IEnumerable sectionsIds, IOrderedEnumerable wellOperationsPlan, IOrderedEnumerable wellOperationsFact)