From fa0389c08fc742e61953c47454badb2c39f1bd05 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 17 Nov 2022 16:09:51 +0500 Subject: [PATCH] Trying to use microsoft in memeory cache --- AsbCloudInfrastructure/DependencyInjection.cs | 7 ++- .../Repository/CrudCacheServiceBase.cs | 48 ++++++++++++++----- .../Repository/CrudServiceBase.cs | 14 ------ .../CrudWellRelatedCacheServiceBase.cs | 12 ++--- .../Repository/CrudWellRelatedServiceBase.cs | 3 -- .../Repository/SetpointsRequestRepository.cs | 5 +- .../Services/FileCategoryService.cs | 7 ++- .../Services/SAUB/SetpointsService.cs | 5 +- .../Services/Subsystems/SubsystemService.cs | 3 +- .../Services/WellService.cs | 16 ++----- 10 files changed, 62 insertions(+), 58 deletions(-) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 0b9c0bc6..a7bf3469 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -16,10 +16,10 @@ using AsbCloudInfrastructure.Services.SAUB; using AsbCloudInfrastructure.Services.Subsystems; using AsbCloudInfrastructure.Services.WellOperationService; using AsbCloudInfrastructure.Validators; -using DocumentFormat.OpenXml.Spreadsheet; using FluentValidation.AspNetCore; using Mapster; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; @@ -93,6 +93,7 @@ namespace AsbCloudInfrastructure services.AddFluentValidation(); + services.AddMemoryCache(); services.AddScoped(provider => provider.GetService()); services.AddScoped(); @@ -140,21 +141,25 @@ namespace AsbCloudInfrastructure services.AddTransient, CrudServiceBase>(s => new CrudCacheServiceBase( s.GetService(), + s.GetService(), dbSet => dbSet.Include(t => t.Well))); // может быть включен в сервис TelemetryService services.AddTransient, DrillParamsService>(); services.AddTransient, CrudCacheServiceBase>(s => new CrudCacheServiceBase( s.GetService(), + s.GetService(), dbSet => dbSet.Include(d => d.Clusters))); services.AddTransient, CrudCacheServiceBase>(s => new CrudCacheServiceBase( s.GetService(), + s.GetService(), dbSet => dbSet.Include(c => c.CompanyType))); services.AddTransient, CrudCacheServiceBase>(); services.AddTransient, CrudCacheServiceBase>(s => new CrudCacheServiceBase( s.GetService(), + s.GetService(), dbSet => dbSet .Include(c => c.Wells) .Include(c => c.Deposit))); // может быть включен в сервис ClusterService diff --git a/AsbCloudInfrastructure/Repository/CrudCacheServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudCacheServiceBase.cs index ae9c1fed..2624d39c 100644 --- a/AsbCloudInfrastructure/Repository/CrudCacheServiceBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudCacheServiceBase.cs @@ -1,6 +1,6 @@ using AsbCloudDb.Model; -using AsbCloudInfrastructure.EfCache; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Linq; @@ -21,16 +21,21 @@ namespace AsbCloudInfrastructure.Repository { protected string CacheTag = typeof(TDto).Name; protected TimeSpan CacheOlescence = TimeSpan.FromMinutes(5); + private readonly IMemoryCache memoryCache; + protected int KeySelector(TEntity entity) => entity.Id; - public CrudCacheServiceBase(IAsbCloudDbContext dbContext) - : base(dbContext) { } + public CrudCacheServiceBase(IAsbCloudDbContext dbContext, IMemoryCache memoryCache) + : base(dbContext) + { + this.memoryCache = memoryCache; + } - public CrudCacheServiceBase(IAsbCloudDbContext dbContext, ISet includes) - : base(dbContext, includes) { } - - public CrudCacheServiceBase(IAsbCloudDbContext dbContext, Func, IQueryable> makeQuery) - : base(dbContext, makeQuery) { } + public CrudCacheServiceBase(IAsbCloudDbContext dbContext, IMemoryCache memoryCache, Func, IQueryable> makeQuery) + : base(dbContext, makeQuery) + { + this.memoryCache = memoryCache; + } /// public override async Task InsertAsync(TDto newItem, CancellationToken token) @@ -103,16 +108,33 @@ namespace AsbCloudInfrastructure.Repository } protected virtual Task> GetCacheAsync(CancellationToken token) - => GetQuery() - .FromCacheAsync(CacheTag, CacheOlescence, Convert, token); + { + var cache = memoryCache.GetOrCreateAsync(CacheTag, async (cacheEntry) => { + cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; + cacheEntry.SlidingExpiration = CacheOlescence; + var entities = await GetQuery().ToArrayAsync(token); + var dtos = entities.Select(Convert); + return dtos.ToArray().AsEnumerable(); + }); + return cache; + } protected virtual IEnumerable GetCache() - => GetQuery() - .FromCache(CacheTag, CacheOlescence, Convert); + { + var cache = memoryCache.GetOrCreate(CacheTag, cacheEntry => { + cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; + cacheEntry.SlidingExpiration= CacheOlescence; + + var entities = GetQuery().ToArray(); + var dtos = entities.Select(Convert); + return dtos.ToArray(); + }); + return cache; + } protected virtual void DropCache() - => dbSet.DropCache(CacheTag); + => memoryCache.Remove(CacheTag); } #nullable disable } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/CrudServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudServiceBase.cs index c6e96d09..67b750cc 100644 --- a/AsbCloudInfrastructure/Repository/CrudServiceBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudServiceBase.cs @@ -31,20 +31,6 @@ namespace AsbCloudInfrastructure.Repository GetQuery = () => dbSet; } - public CrudServiceBase(IAsbCloudDbContext dbContext, ISet includes) - { - this.dbContext = dbContext; - dbSet = dbContext.Set(); - - GetQuery = () => - { - IQueryable query = dbSet; - foreach (var include in includes) - query = query.Include(include); - return query; - }; - } - public CrudServiceBase(IAsbCloudDbContext context, Func, IQueryable> makeQuery) { dbContext = context; diff --git a/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheServiceBase.cs index 77729a13..a7eb3305 100644 --- a/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheServiceBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheServiceBase.cs @@ -1,6 +1,7 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Linq; @@ -14,14 +15,11 @@ namespace AsbCloudInfrastructure.Repository where TDto : AsbCloudApp.Data.IId, AsbCloudApp.Data.IWellRelated where TEntity : class, IId, IWellRelated { - public CrudWellRelatedCacheServiceBase(IAsbCloudDbContext context) - : base(context) { } + public CrudWellRelatedCacheServiceBase(IAsbCloudDbContext context, IMemoryCache memoryCache) + : base(context, memoryCache) { } - public CrudWellRelatedCacheServiceBase(IAsbCloudDbContext dbContext, ISet includes) - : base(dbContext, includes) { } - - public CrudWellRelatedCacheServiceBase(IAsbCloudDbContext context, Func, IQueryable> makeQuery) - : base(context, makeQuery) { } + public CrudWellRelatedCacheServiceBase(IAsbCloudDbContext context, IMemoryCache memoryCache, Func, IQueryable> makeQuery) + : base(context, memoryCache, makeQuery) { } public async Task?> GetByIdWellAsync(int idWell, CancellationToken token) { diff --git a/AsbCloudInfrastructure/Repository/CrudWellRelatedServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudWellRelatedServiceBase.cs index 0e9a3ad8..b79277cc 100644 --- a/AsbCloudInfrastructure/Repository/CrudWellRelatedServiceBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudWellRelatedServiceBase.cs @@ -17,9 +17,6 @@ namespace AsbCloudInfrastructure.Repository public CrudWellRelatedServiceBase(IAsbCloudDbContext context) : base(context) { } - public CrudWellRelatedServiceBase(IAsbCloudDbContext dbContext, ISet includes) - : base(dbContext, includes) { } - public CrudWellRelatedServiceBase(IAsbCloudDbContext context, Func, IQueryable> makeQuery) : base(context, makeQuery) { } diff --git a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs index 3519a8e0..c9379244 100644 --- a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs +++ b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using System; namespace AsbCloudInfrastructure.Repository @@ -10,8 +11,8 @@ namespace AsbCloudInfrastructure.Repository { private readonly IWellService wellService; - public SetpointsRequestRepository(IAsbCloudDbContext dbContext, IWellService wellService) - : base(dbContext, q => q.Include(s => s.Author) + public SetpointsRequestRepository(IAsbCloudDbContext dbContext, IMemoryCache memoryCache, IWellService wellService) + : base(dbContext, memoryCache, q => q.Include(s => s.Author) .Include(s => s.Well)) { this.wellService = wellService; diff --git a/AsbCloudInfrastructure/Services/FileCategoryService.cs b/AsbCloudInfrastructure/Services/FileCategoryService.cs index b1976e64..8721ef25 100644 --- a/AsbCloudInfrastructure/Services/FileCategoryService.cs +++ b/AsbCloudInfrastructure/Services/FileCategoryService.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Repository; +using Microsoft.Extensions.Caching.Memory; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -11,10 +12,8 @@ namespace AsbCloudInfrastructure.Services { public class FileCategoryService : CrudCacheServiceBase, IFileCategoryService { - public FileCategoryService(IAsbCloudDbContext context) - : base(context) - { - } + public FileCategoryService(IAsbCloudDbContext context, IMemoryCache memoryCache) + : base(context, memoryCache) { } //TODO: Перенести в сервис "дело скважины" public async Task> GetWellCaseCategoriesAsync(CancellationToken token) diff --git a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs index ce297d83..4d9c4769 100644 --- a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs @@ -3,6 +3,7 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Repository; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Linq; @@ -30,9 +31,9 @@ namespace AsbCloudInfrastructure.Services.SAUB private readonly SetpointsRequestRepository setpointsRepository; private readonly ITelemetryService telemetryService; - public SetpointsService(IAsbCloudDbContext db, ITelemetryService telemetryService, IWellService wellService) + public SetpointsService(IAsbCloudDbContext db, IMemoryCache memoryCache, ITelemetryService telemetryService, IWellService wellService) { - setpointsRepository = new SetpointsRequestRepository(db, wellService); + setpointsRepository = new SetpointsRequestRepository(db, memoryCache, wellService); this.telemetryService = telemetryService; } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index 749dbbdf..6491265a 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -6,6 +6,7 @@ using AsbCloudDb.Model.Subsystems; using AsbCloudInfrastructure.Repository; using Mapster; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -17,7 +18,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems internal class SubsystemService : CrudCacheServiceBase, ISubsystemService { private readonly IWellService wellService; - public SubsystemService(IAsbCloudDbContext dbContext, IWellService wellService) : base(dbContext) + public SubsystemService(IAsbCloudDbContext dbContext, IMemoryCache memoryCache, IWellService wellService) : base(dbContext, memoryCache) { this.wellService = wellService; } diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 2b33d7bf..7869d534 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -7,6 +7,7 @@ using AsbCloudInfrastructure.Repository; using AsbCloudInfrastructure.Services.Cache; using Mapster; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Linq; @@ -34,16 +35,16 @@ namespace AsbCloudInfrastructure.Services .Include(w => w.Telemetry) .Include(w => w.WellType) .Include(w => w.RelationCompaniesWells) - .ThenInclude(r => r.Company); + .ThenInclude(r => r.Company); - public WellService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService, ITimezoneService timezoneService) - : base(db, MakeQueryWell) + public WellService(IAsbCloudDbContext db, IMemoryCache memoryCache, CacheDb cacheDb, ITelemetryService telemetryService, ITimezoneService timezoneService) + : base(db, memoryCache, MakeQueryWell) { this.telemetryService = telemetryService; this.timezoneService = timezoneService; this.wellOperationService = new WellOperationService.WellOperationService(db, cacheDb, this); - companyTypesService = new CrudCacheServiceBase(dbContext); + companyTypesService = new CrudCacheServiceBase(dbContext, memoryCache); } private IEnumerable GetCacheRelationCompanyWell() @@ -167,13 +168,6 @@ namespace AsbCloudInfrastructure.Services return dtos; } - private IEnumerable GetCompanies(int idWell) - { - var relations = GetCacheRelationCompanyWell().Where(r => r.IdWell == idWell); - var dtos = relations.Select(r => Convert(r.Company)); - return dtos; - } - public string GetStateText(int state) { return state switch