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); /// /// Создать кеш на основе асинхронного запроса к БД. /// Ключ кеша - полное имя типа T. /// /// /// /// /// /// public static Task> GetOrCreateBasicAsync(this IMemoryCache memoryCache, IQueryable query, CancellationToken token) where T : class { var getter = async (CancellationToken token) => { var entities = await query .AsNoTracking() .ToArrayAsync(token); return entities.AsEnumerable(); }; return memoryCache.GetOrCreateBasicAsync(getter, token); } /// /// Создать кеш на основе результата выполнения произвольной асинхронной функции. /// Ключ кеша - полное имя типа T. /// /// /// /// /// /// public static Task> GetOrCreateBasicAsync(this IMemoryCache memoryCache, Func>> getterAsync, CancellationToken token) { var key = typeof(T).FullName; var cache = memoryCache.GetOrCreateAsync(key, async (cacheEntry) => { cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; cacheEntry.SlidingExpiration = CacheOlescence; var entities = await getterAsync(token); return entities; }); return cache; } /// /// Создать кеш на основе запроса к БД. /// Ключ кеша - полное имя типа T. /// /// /// /// /// public static IEnumerable GetOrCreateBasic(this IMemoryCache memoryCache, IQueryable query) where T : class { var getter = () => query .AsNoTracking() .ToArray(); return memoryCache.GetOrCreateBasic(getter); } /// /// Создать кеш на основе результата выполнения произвольной функции. /// Ключ кеша - полное имя типа T. /// /// /// /// /// public static IEnumerable GetOrCreateBasic(this IMemoryCache memoryCache, Func> getter) { var key = typeof(T).FullName; var cache = memoryCache.GetOrCreate(key, cacheEntry => { cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; cacheEntry.SlidingExpiration = CacheOlescence; return getter(); }); return cache; } /// /// Сбросить кеш. /// Ключ кеша - полное имя типа T. /// /// /// public static void DropBasic(this IMemoryCache memoryCache) where T : class { var key = typeof(T).FullName; memoryCache.Remove(key); } } }