namespace MiaoYu.Core.CodeGenerator.Services; /// /// 表结构缓存服务实现 /// [Component] public class TableSchemaCache : ITableSchemaCache, IScopedDependency { private readonly IMemoryCache _memoryCache; private readonly DataSourceManager _dataSourceManager; private readonly ILogger _logger; private const string CACHE_KEY = "CodeGenerator:AllTables"; private static readonly TimeSpan CACHE_DURATION = TimeSpan.FromMinutes(20); public TableSchemaCache( IMemoryCache memoryCache, DataSourceManager dataSourceManager, ILogger logger) { _memoryCache = memoryCache; _dataSourceManager = dataSourceManager; _logger = logger; } /// /// 获取所有表信息(从缓存或数据库) /// public List GetAllTables() { return _memoryCache.GetOrCreate(CACHE_KEY, entry => { entry.SlidingExpiration = CACHE_DURATION; _logger.LogInformation("缓存未命中,从数据库查询表结构信息"); var tables = _dataSourceManager.GetAllTables(); _logger.LogInformation("成功加载 {Count} 个表到缓存", tables.Count); return tables; }) ?? new List(); } /// /// 刷新缓存 /// public void RefreshCache() { _logger.LogInformation("手动刷新表结构缓存"); _memoryCache.Remove(CACHE_KEY); // 重新加载 GetAllTables(); } /// /// 清除缓存 /// public void ClearCache() { _logger.LogInformation("清除表结构缓存"); _memoryCache.Remove(CACHE_KEY); } /// /// 根据数据库和表名获取表信息 /// public DbTableInfo? GetTable(string databaseKey, string tableName) { var allTables = GetAllTables(); return allTables.FirstOrDefault(t => t.DataBase?.Equals(databaseKey, StringComparison.OrdinalIgnoreCase) == true && t.Name?.Equals(tableName, StringComparison.OrdinalIgnoreCase) == true); } }