using KH.WMS.Core.Constants;
using KH.WMS.Core.Database.UnitOfWorks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using SqlSugar;
using StackExchange.Profiling;
namespace KH.WMS.Core.Database.SqlSugar;
///
/// SQL Sugar 配置
///
public static class SqlSugarSetup
{
///
/// 添加 SQL Sugar 服务
///
public static IServiceCollection AddSqlSugar(this IServiceCollection services, IConfiguration configuration)
{
services.Configure(configuration.GetSection(AppSettingsConstants.DbConnection));
Console.WriteLine("SqlSugar 正在初始化数据库连接...");
services.AddSingleton(provider =>
{
var options = provider.GetRequiredService>().Value;
var logger = provider.GetService>();
var config = new ConnectionConfig
{
ConnectionString = options.ConnectionString,
DbType = GetDbType(options.DbType),
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,
AopEvents = new AopEvents
{
OnLogExecuting = (sql, pars) =>
{
var paramStr = string.Join(", ", pars.Select(p => $"{p.ParameterName}={p.Value}"));
Parallel.For(0, 1, e =>
{
MiniProfiler.Current.CustomTiming("SQL:", paramStr + "【SQL语句】:" + sql);
});
// 使用 Verbose 级别记录每一行 SQL 执行
if (options.EnableSqlLog && logger != null)
{
logger.LogTrace("[SQL执行] {Sql} | 参数: {Params}", sql, paramStr);
}
// 开发环境同时输出到控制台
if (options.EnableSqlLog)
{
Console.WriteLine($"SQL: {sql}\nPARAMS: {paramStr}");
}
}
},
};
// 开发环境打印SQL
if (options.EnableSqlLog)
{
config.ConfigureExternalServices = new ConfigureExternalServices
{
//SqlFuncServices = new SqlFuncExternalService(),
EntityService = null,
//DataInfoCacheService =
};
}
return new SqlSugarClient(config);
});
//services.AddScoped();
//services.AddScoped();
return services;
}
private static DbType GetDbType(string dbType)
{
return dbType.ToLower() switch
{
AppSettingsConstants.DbType_MySql => DbType.MySql,
AppSettingsConstants.DbType_SqlServer => DbType.SqlServer,
AppSettingsConstants.DbType_PostgreSql => DbType.PostgreSQL,
AppSettingsConstants.DbType_Oracle => DbType.Oracle,
AppSettingsConstants.DbType_Sqlite => DbType.Sqlite,
_ => DbType.SqlServer
};
}
}
///
/// 数据库配置选项
///
public class DatabaseOptions
{
///
/// 连接字符串
///
public string ConnectionString { get; set; } = string.Empty;
///
/// 数据库类型
///
public string DbType { get; set; } = AppSettingsConstants.DbType_SqlServer;
///
/// 是否启用SQL日志
///
public bool EnableSqlLog { get; set; } = true;
///
/// 命令超时时间(秒)
///
public int CommandTimeout { get; set; } = 30;
}