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