|
|
using System.Linq.Dynamic.Core;
|
|
|
using System.Linq.Expressions;
|
|
|
using System.Reflection;
|
|
|
using DS.Module.Core;
|
|
|
using DS.Module.Core.Data;
|
|
|
using DS.Module.Core.Extensions;
|
|
|
using DS.Module.User;
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
using Newtonsoft.Json;
|
|
|
using NLog;
|
|
|
using SqlSugar;
|
|
|
using SqlSugar.Extensions;
|
|
|
using LogLevel = NLog.LogLevel;
|
|
|
|
|
|
namespace DS.Module.SqlSugar;
|
|
|
|
|
|
/// <summary>
|
|
|
/// SqlSugar 启动服务
|
|
|
/// </summary>
|
|
|
public static class SqlsugarInstall
|
|
|
{
|
|
|
// /// <summary>
|
|
|
// /// 数据库连接字符串
|
|
|
// /// </summary>
|
|
|
// private static string DbInfo = AppSetting.Configuration["ConnectionStrings:DbInfo"];
|
|
|
//
|
|
|
// /// <summary>
|
|
|
// /// 数据库类型
|
|
|
// /// </summary>
|
|
|
// private static string DbType = AppSetting.Configuration["ConnectionStrings:DbType"];
|
|
|
|
|
|
static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
|
|
// private readonly IUser user;
|
|
|
|
|
|
// private ILogger<SqlsugarInstall> _logger;
|
|
|
/// <summary>
|
|
|
/// 将模块服务添加到依赖注入服务容器中
|
|
|
/// </summary>
|
|
|
/// <param name="services">依赖注入服务容器</param>
|
|
|
/// <returns></returns>
|
|
|
public static IServiceCollection AddSqlsugarInstall(this IServiceCollection services)
|
|
|
{
|
|
|
if (services == null) throw new ArgumentNullException(nameof(services));
|
|
|
|
|
|
var dbs = AppSetting.app<DbConfig>( "DBInfo", "DBS");
|
|
|
//默认数据库
|
|
|
List<DbConfig> dbList = new List<DbConfig>();
|
|
|
DbConfig defaultdb = new DbConfig()
|
|
|
{
|
|
|
ConnId = AppSetting.app(new string[] { "DBInfo", "DefaultDbConnId" }),
|
|
|
Connection = AppSetting.app(new string[] { "DBInfo", "DefaultDbString" }),
|
|
|
DbType = AppSetting.app(new string[] { "DBInfo", "DefaultDbType" }).ObjToInt()
|
|
|
};
|
|
|
dbList.Add(defaultdb);
|
|
|
//业务数据库集合
|
|
|
foreach (var item in dbs)
|
|
|
{
|
|
|
dbList.Add(item);
|
|
|
}
|
|
|
|
|
|
List<ConnectionConfig> connectConfigList = new List<ConnectionConfig>();
|
|
|
|
|
|
foreach (var item in dbList)
|
|
|
{
|
|
|
//防止数据库重复,导致的事务异常
|
|
|
if (connectConfigList.Any(a => a.ConfigId == (dynamic)item.ConnId || a.ConnectionString == item.Connection))
|
|
|
{
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
connectConfigList.Add(new ConnectionConfig()
|
|
|
{
|
|
|
ConnectionString = item.Connection,
|
|
|
DbType = (DbType)item.DbType,
|
|
|
IsAutoCloseConnection = true,
|
|
|
ConfigId = item.ConnId,
|
|
|
InitKeyType = InitKeyType.Attribute,
|
|
|
MoreSettings = new ConnMoreSettings()
|
|
|
{
|
|
|
IsAutoRemoveDataCache = true //自动清理缓存
|
|
|
},
|
|
|
// 自定义特性
|
|
|
ConfigureExternalServices = new ConfigureExternalServices()
|
|
|
{
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
//全局上下文生效
|
|
|
SqlSugarScope sqlSugar = new SqlSugarScope(connectConfigList,
|
|
|
db =>
|
|
|
{
|
|
|
/*
|
|
|
* 默认只会配置到第一个数据库,这里按照官方文档进行多数据库/多租户文档的说明进行循环配置
|
|
|
*/
|
|
|
foreach (var c in connectConfigList)
|
|
|
{
|
|
|
var dbProvider = db.GetConnectionScope((string)c.ConfigId);
|
|
|
var user = services.GetService<IUser>();
|
|
|
//单例参数配置,所有上下文生效
|
|
|
dbProvider.Ado.CommandTimeOut = 30;
|
|
|
dbProvider.Aop.OnLogExecuting = (sql, pars) =>
|
|
|
{
|
|
|
Logger.Log(LogLevel.Info,
|
|
|
DateTime.Now.ToString() + "\r\n" +
|
|
|
UtilMethods.GetSqlString(c.DbType, sql, pars));
|
|
|
};
|
|
|
dbProvider.Aop.DataExecuting = (oldValue, entityInfo) =>
|
|
|
{
|
|
|
// 新增操作
|
|
|
if (entityInfo.OperationType == DataFilterType.InsertByObject)
|
|
|
{
|
|
|
if (entityInfo.PropertyName == "Id")
|
|
|
{
|
|
|
if (entityInfo.EntityColumnInfo.PropertyInfo.PropertyType == typeof(string))
|
|
|
{
|
|
|
entityInfo.SetValue(GuidHelper.GetSnowflakeId());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (entityInfo.PropertyName == "AddTime")
|
|
|
entityInfo.SetValue(DateTime.Now);
|
|
|
|
|
|
if (!user.GetTenantId().ToString().IsNullOrEmpty())
|
|
|
{
|
|
|
if (entityInfo.PropertyName == "TenantId")
|
|
|
entityInfo.SetValue(user.GetTenantId());
|
|
|
}
|
|
|
// if (entityInfo.PropertyName == "TenantId")
|
|
|
// entityInfo.SetValue(user.GetTenantId());
|
|
|
|
|
|
if (entityInfo.PropertyName == "AddBy")
|
|
|
entityInfo.SetValue(user.UserId);
|
|
|
if (entityInfo.PropertyName == "Deleted")
|
|
|
entityInfo.SetValue(false);
|
|
|
}
|
|
|
|
|
|
// 更新操作
|
|
|
if (entityInfo.OperationType == DataFilterType.UpdateByObject)
|
|
|
{
|
|
|
if (entityInfo.PropertyName == "UpdateTime")
|
|
|
entityInfo.SetValue(DateTime.Now);
|
|
|
if (entityInfo.PropertyName == "UpdateBy")
|
|
|
entityInfo.SetValue(user.UserId);
|
|
|
}
|
|
|
};
|
|
|
dbProvider.Aop.OnError = (exp) => //执行SQL 错误事件
|
|
|
{
|
|
|
Logger.Error(DateTime.Now.ToString() + "\r\n" + exp.Sql + "\r\n" + exp.Parametres);
|
|
|
};
|
|
|
//从程序集拿到实体type集合
|
|
|
Type[] types = Assembly
|
|
|
.LoadFrom("DS.WMS.Core.dll") //如果 .dll报错,可以换成 xxx.exe 有些生成的是exe
|
|
|
.GetTypes().Where(it => it.FullName.Contains("DS.WMS.Core.")) //命名空间过滤,当然你也可以写其他条件过滤
|
|
|
.ToArray(); //断点调试一下是不是需要的Type,不是需要的在进行过滤
|
|
|
//全局过滤器
|
|
|
// var superAdminViewAllData = Convert.ToBoolean(App.GetOptions<SystemSettingsOptions>().SuperAdminViewAllData);
|
|
|
foreach (var entityType in types)
|
|
|
{
|
|
|
// 配置多租户全局过滤器
|
|
|
if (!entityType.GetProperty("TenantId").IsNull())
|
|
|
{
|
|
|
//判断实体类中包含TenantId属性
|
|
|
//构建动态Lambda
|
|
|
var lambda = DynamicExpressionParser.ParseLambda
|
|
|
(new[] { Expression.Parameter(entityType, "it") },
|
|
|
typeof(bool), $"{nameof(DBEntityTenant.TenantId)} == @0 ",
|
|
|
user.GetTenantId());
|
|
|
dbProvider.QueryFilter.Add(new TableFilterItem<object>(entityType, lambda)); //将Lambda传入过滤器
|
|
|
}
|
|
|
// // 配置加删除全局过滤器
|
|
|
// if (!entityType.GetProperty("Deleted").IsNull())
|
|
|
// { //判断实体类中包含IsDeleted属性
|
|
|
// //构建动态Lambda
|
|
|
// var lambda = DynamicExpressionParser.ParseLambda
|
|
|
// (new[] { Expression.Parameter(entityType, "it") },
|
|
|
// typeof(bool), $"{nameof("Deleted")} == @0",
|
|
|
// false);
|
|
|
// db.QueryFilter.Add(new TableFilterItem<object>(entityType, lambda)
|
|
|
// {
|
|
|
// IsJoinQuery = true
|
|
|
// }); //将Lambda传入过滤器
|
|
|
// }
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|
|
|
services.AddSingleton<ISqlSugarClient>(sqlSugar); //这边是SqlSugarScope用AddSingleton
|
|
|
|
|
|
|
|
|
return services;
|
|
|
}
|
|
|
} |