文件内容 AuditMetadataCache.cs 2 KB 2467 字符
using Microsoft.Extensions.Caching.Memory;
using System.Reflection;

namespace PasteApeart.EntityFrameworkCore.auditing
{

    /// <summary>
    /// 
    /// </summary>
    public class AuditMetadataCache : IDisposable
    {
        private readonly IMemoryCache _cache;
        private readonly TimeSpan _expiration;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="expiration"></param>
        public AuditMetadataCache(TimeSpan? expiration = null)
        {
            _cache = new MemoryCache(new MemoryCacheOptions());
            _expiration = expiration ?? TimeSpan.FromHours(1); // 默认1小时过期
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        // 检查类是否禁用审计
        public bool IsAuditDisabledOnType(Type type)
        {
            var key = $"Class_{type.FullName}";

            return _cache.GetOrCreate(key, entry =>
            {
                entry.SlidingExpiration = _expiration;
                return type.GetCustomAttribute<DisableAuditingAttribute>() != null;
            });
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="property"></param>
        /// <returns></returns>
        public bool IsAuditDisabledOnProperty(PropertyInfo property)
        {
            var key = $"Property_{property.DeclaringType?.FullName}_{property.Name}";

            return _cache.GetOrCreate(key, entry =>
            {
                entry.SlidingExpiration = _expiration;
                return property.GetCustomAttribute<DisableAuditingAttribute>() != null;
            });
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="type"></param>
        public void ClearType(Type type)
        {
            _cache.Remove($"Class_{type.FullName}");

            // 清除该类型的所有属性缓存
            foreach (var property in type.GetProperties())
            {
                _cache.Remove($"Property_{type.FullName}_{property.Name}");
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public void ClearAll()
        {
            if (_cache is MemoryCache memoryCache)
            {
                memoryCache.Compact(1.0); // 清除所有
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public void Dispose()
        {
            _cache?.Dispose();
        }
    }
}
​ ​