using Microsoft.Extensions.Caching.Memory; namespace Harmonia.Core.Caching; public abstract class MemoryCache : Cache where TKey : notnull { private readonly IMemoryCache _memoryCache; protected virtual long? SizeLimit => 2000000000; protected virtual double CompactionPercentage => 0.2; protected virtual TimeSpan SlidingExpiration => TimeSpan.FromSeconds(600); public MemoryCache() { MemoryCacheOptions memoryCacheOptions = new() { SizeLimit = SizeLimit, CompactionPercentage = CompactionPercentage }; _memoryCache = new MemoryCache(memoryCacheOptions); } protected override TValue? TryGetValue(object key) { _memoryCache.TryGetValue(key, out TValue? value); return value; } protected override void AddToCache(object key, TValue entry) { long entrySize = GetEntrySize(entry); var cacheEntryOptions = new MemoryCacheEntryOptions() .SetSize(entrySize) .SetSlidingExpiration(SlidingExpiration); _memoryCache.Set(key, entry, cacheEntryOptions); } protected abstract long GetEntrySize(TValue entry); }