using SqlSugar;
using Microsoft.Extensions.Configuration;
namespace AssetManager.Data;
public static class SqlSugarConfig
{
private static IConfiguration? _configuration;
///
/// 初始化配置(在Program.cs中调用)
///
public static void Initialize(IConfiguration configuration)
{
_configuration = configuration;
}
///
/// 获取 SqlSugarClient 实例(用于后台任务,每次创建新实例)
///
public static ISqlSugarClient GetSqlSugarClient()
{
if (_configuration == null)
{
throw new InvalidOperationException("SqlSugarConfig has not been initialized. Call Initialize() first.");
}
var connectionString = GetConnectionString();
// 使用 SqlSugarClient(非 Scope),每次创建独立实例
// 适合后台任务、Task.Run 场景
return new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = connectionString,
DbType = DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,
ConfigureExternalServices = new ConfigureExternalServices
{
EntityService = (property, column) =>
{
if (property.PropertyType == typeof(DateTime))
{
column.DataType = "datetime(3)";
}
}
}
});
}
///
/// 获取 SqlSugarScope 实例(用于 DI 注入,Singleton/Scoped)
///
public static ISqlSugarClient GetSqlSugarScope()
{
if (_configuration == null)
{
throw new InvalidOperationException("SqlSugarConfig has not been initialized. Call Initialize() first.");
}
var connectionString = GetConnectionString();
return new SqlSugarScope(new ConnectionConfig()
{
ConnectionString = connectionString,
DbType = DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,
ConfigureExternalServices = new ConfigureExternalServices
{
EntityService = (property, column) =>
{
if (property.PropertyType == typeof(DateTime))
{
column.DataType = "datetime(3)";
}
}
}
});
}
private static string GetConnectionString()
{
var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings__Default")
?? _configuration!.GetConnectionString("Default")
?? throw new InvalidOperationException("Connection string 'Default' not found in environment variables or configuration.");
// MySQL 连接池优化配置
if (!connectionString.Contains("Pooling=", StringComparison.OrdinalIgnoreCase))
{
connectionString += ";Pooling=true";
}
if (!connectionString.Contains("MaximumPoolSize=", StringComparison.OrdinalIgnoreCase))
{
connectionString += ";MaximumPoolSize=100";
}
if (!connectionString.Contains("MinimumPoolSize=", StringComparison.OrdinalIgnoreCase))
{
connectionString += ";MinimumPoolSize=5";
}
if (!connectionString.Contains("ConnectionTimeout=", StringComparison.OrdinalIgnoreCase))
{
connectionString += ";ConnectionTimeout=30";
}
if (!connectionString.Contains("ConnectionIdleTimeout=", StringComparison.OrdinalIgnoreCase))
{
connectionString += ";ConnectionIdleTimeout=180";
}
return connectionString;
}
}