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; /// /// SqlSugar 启动服务 /// public static class SqlsugarInstall { // /// // /// 数据库连接字符串 // /// // private static string DbInfo = AppSetting.Configuration["ConnectionStrings:DbInfo"]; // // /// // /// 数据库类型 // /// // private static string DbType = AppSetting.Configuration["ConnectionStrings:DbType"]; static readonly Logger Logger = LogManager.GetCurrentClassLogger(); // private readonly IUser user; // private ILogger _logger; /// /// 将模块服务添加到依赖注入服务容器中 /// /// 依赖注入服务容器 /// public static IServiceCollection AddSqlsugarInstall(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof(services)); var dbs = AppSetting.app( "DBInfo", "DBS"); //默认数据库 List dbList = new List(); 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 connectConfigList = new List(); 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(); //单例参数配置,所有上下文生效 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().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(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(entityType, lambda) // { // IsJoinQuery = true // }); //将Lambda传入过滤器 // } } } }); services.AddSingleton(sqlSugar); //这边是SqlSugarScope用AddSingleton return services; } }