HuanMengAdmin/admin-server/MiaoYu.Core.CodeGenerator/Services/TableSchemaCache.cs
2025-11-08 02:39:31 +08:00

80 lines
2.2 KiB
C#

namespace MiaoYu.Core.CodeGenerator.Services;
/// <summary>
/// 表结构缓存服务实现
/// </summary>
[Component]
public class TableSchemaCache : ITableSchemaCache
{
private readonly IMemoryCache _memoryCache;
private readonly DataSourceManager _dataSourceManager;
private readonly ILogger<TableSchemaCache> _logger;
private const string CACHE_KEY = "CodeGenerator:AllTables";
private static readonly TimeSpan CACHE_DURATION = TimeSpan.FromMinutes(20);
public TableSchemaCache(
IMemoryCache memoryCache,
DataSourceManager dataSourceManager,
ILogger<TableSchemaCache> logger)
{
_memoryCache = memoryCache;
_dataSourceManager = dataSourceManager;
_logger = logger;
}
/// <summary>
/// 获取所有表信息(从缓存或数据库)
/// </summary>
public List<DbTableInfo> 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<DbTableInfo>();
}
/// <summary>
/// 刷新缓存
/// </summary>
public void RefreshCache()
{
_logger.LogInformation("手动刷新表结构缓存");
_memoryCache.Remove(CACHE_KEY);
// 重新加载
GetAllTables();
}
/// <summary>
/// 清除缓存
/// </summary>
public void ClearCache()
{
_logger.LogInformation("清除表结构缓存");
_memoryCache.Remove(CACHE_KEY);
}
/// <summary>
/// 根据数据库和表名获取表信息
/// </summary>
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);
}
}