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);
}
}
}