DD.WellWorkover.Cloud/AsbCloudInfrastructure/MemoryCacheExtentions.cs

104 lines
4.1 KiB
C#
Raw Normal View History

using Microsoft.EntityFrameworkCore;
2022-11-18 15:07:27 +05:00
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudInfrastructure
{
#nullable enable
2022-11-18 15:07:27 +05:00
public static class MemoryCacheExtentions
{
private static readonly TimeSpan CacheOlescence = TimeSpan.FromMinutes(5);
/// <summary>
/// Создать кеш на основе асинхронного запроса к БД.
/// Ключ кеша - полное имя типа T.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="memoryCache"></param>
/// <param name="query"></param>
/// <param name="token"></param>
/// <returns></returns>
public static Task<IEnumerable<T>> GetOrCreateBasicAsync<T>(this IMemoryCache memoryCache, IQueryable<T> query, CancellationToken token)
{
var getter = async (CancellationToken token) =>
{
var entities = await query
.ToArrayAsync(token);
return entities.AsEnumerable();
};
return memoryCache.GetOrCreateBasicAsync(getter, token);
}
/// <summary>
/// Создать кеш на основе результата выполнения произвольной асинхронной функции.
/// Ключ кеша - полное имя типа T.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="memoryCache"></param>
/// <param name="getterAsync"></param>
/// <param name="token"></param>
/// <returns></returns>
public static Task<IEnumerable<T>> GetOrCreateBasicAsync<T>(this IMemoryCache memoryCache, Func<CancellationToken, Task<IEnumerable<T>>> getterAsync, CancellationToken token)
{
var key = typeof(T).FullName;
var cache = memoryCache.GetOrCreateAsync(key, async (cacheEntry) => {
2022-11-18 15:07:27 +05:00
cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence;
cacheEntry.SlidingExpiration = CacheOlescence;
var entities = await getterAsync(token);
return entities;
2022-11-18 15:07:27 +05:00
});
return cache;
}
/// <summary>
/// Создать кеш на основе запроса к БД.
/// Ключ кеша - полное имя типа T.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="memoryCache"></param>
/// <param name="query"></param>
/// <returns></returns>
public static IEnumerable<T> GetOrCreateBasic<T>(this IMemoryCache memoryCache, IQueryable<T> query)
{
var getter = () => query.ToArray();
return memoryCache.GetOrCreateBasic(getter);
}
/// <summary>
/// Создать кеш на основе результата выполнения произвольной функции.
/// Ключ кеша - полное имя типа T.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="memoryCache"></param>
/// <param name="getter"></param>
/// <returns></returns>
public static IEnumerable<T> GetOrCreateBasic<T>(this IMemoryCache memoryCache, Func<IEnumerable<T>> getter)
{
var key = typeof(T).FullName;
var cache = memoryCache.GetOrCreate(key, cacheEntry => {
2022-11-18 15:07:27 +05:00
cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence;
cacheEntry.SlidingExpiration = CacheOlescence;
return getter();
2022-11-18 15:07:27 +05:00
});
return cache;
}
/// <summary>
/// Сбросить кеш.
/// Ключ кеша - полное имя типа T.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="memoryCache"></param>
public static void DropBasic<T>(this IMemoryCache memoryCache)
where T : class
{
var key = typeof(T).FullName;
memoryCache.Remove(key);
}
2022-11-18 15:07:27 +05:00
}
}