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;
|
|
/// <summary>
|
/// SQL Sugar 配置
|
/// </summary>
|
public static class SqlSugarSetup
|
{
|
/// <summary>
|
/// 添加 SQL Sugar 服务
|
/// </summary>
|
public static IServiceCollection AddSqlSugar(this IServiceCollection services, IConfiguration configuration)
|
{
|
services.Configure<DatabaseOptions>(configuration.GetSection(AppSettingsConstants.DbConnection));
|
|
Console.WriteLine("SqlSugar 正在初始化数据库连接...");
|
|
services.AddSingleton<ISqlSugarClient>(provider =>
|
{
|
var options = provider.GetRequiredService<IOptions<DatabaseOptions>>().Value;
|
var logger = provider.GetService<ILogger<SqlSugarClient>>();
|
|
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<IDbContext, SqlSugarDbContext>();
|
//services.AddScoped<IUnitOfWork, UnitOfWork>();
|
|
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
|
};
|
}
|
}
|
|
/// <summary>
|
/// 数据库配置选项
|
/// </summary>
|
public class DatabaseOptions
|
{
|
/// <summary>
|
/// 连接字符串
|
/// </summary>
|
public string ConnectionString { get; set; } = string.Empty;
|
|
/// <summary>
|
/// 数据库类型
|
/// </summary>
|
public string DbType { get; set; } = AppSettingsConstants.DbType_SqlServer;
|
|
/// <summary>
|
/// 是否启用SQL日志
|
/// </summary>
|
public bool EnableSqlLog { get; set; } = true;
|
|
/// <summary>
|
/// 命令超时时间(秒)
|
/// </summary>
|
public int CommandTimeout { get; set; } = 30;
|
}
|