using Microsoft.Extensions.Options;
using MyHomePage.Api.Infrastructure.Configuration;
using SqlSugar;
namespace MyHomePage.Api.Infrastructure.Database;
///
/// SqlSugar 上下文(单例生命周期)。
/// 根据 自动切换 MySQL / SQLite。
///
public class SqlSugarContext : IDisposable
{
private readonly DatabaseOptions _options;
public ISqlSugarClient Db { get; }
public SqlSugarContext(IOptions options)
{
_options = options.Value;
Db = new SqlSugarScope(BuildConnectionConfig(_options), BuildAopConfig());
}
/// 根据配置构建 SqlSugar 连接配置
private static ConnectionConfig BuildConnectionConfig(DatabaseOptions options)
{
var dbType = options.Provider.Equals("MySql", StringComparison.OrdinalIgnoreCase)
? DbType.MySql
: DbType.Sqlite;
return new ConnectionConfig
{
ConfigId = "default",
ConnectionString = options.ConnectionString,
DbType = dbType,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,
// SqlSugar AOP 启用默认值
MoreSettings = new ConnMoreSettings
{
IsAutoRemoveDataCache = true
}
};
}
/// 配置 AOP:日志 + 性能监控
private static Action BuildAopConfig() => db =>
{
db.Aop.OnLogExecuting = (sql, parameters) =>
{
// 由 Serilog / 默认 logger 接管,避免在控制台双打
// 这里只做轻量占位,实际日志由 SqlSugarScopeClientConfiguration 注入的 logger 输出
};
};
public void Dispose()
{
Db?.Dispose();
GC.SuppressFinalize(this);
}
}