using Admin.Core.Common.Auth; using Admin.Core.Common.BaseModel; using Admin.Core.Common.Cache; using Admin.Core.Common.Configs; using Admin.Core.Model.Admin; using FreeSql; using Microsoft.Extensions.DependencyInjection; using System; namespace Admin.Core.Repository { public static class IdleBusExtesions { /// /// 获得FreeSql实例 /// /// /// /// public static IFreeSql GetFreeSql(this IdleBus ib, IServiceProvider serviceProvider) { var user = serviceProvider.GetRequiredService(); var appConfig = serviceProvider.GetRequiredService(); if (appConfig.Tenant && user.DataIsolationType == DataIsolationType.OwnDb) { var tenantName = "tenant_" + user.TenantId?.ToString(); ib.TryRegister(tenantName, () => CreateFreeSql(user, appConfig, serviceProvider)); return ib.Get(tenantName); } else { var freeSql = serviceProvider.GetRequiredService(); return freeSql; } } /// /// 创建FreeSql实例 /// /// /// /// /// private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, IServiceProvider serviceProvider) { var dbConfig = serviceProvider.GetRequiredService(); //查询租户数据库信息 var freeSql = serviceProvider.GetRequiredService(); var tenantRepository = freeSql.GetRepository(); var tenant = tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(user.TenantId).ToOne(a => new { a.DbType, a.ConnectionString }); var freeSqlBuilder = new FreeSqlBuilder() .UseConnectionString(tenant.DbType.Value, tenant.ConnectionString) .UseAutoSyncStructure(false) .UseLazyLoading(false) .UseNoneCommandParameter(true); #region 监听所有命令 if (dbConfig.MonitorCommand) { freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) => { Console.WriteLine($"{cmd.CommandText}\r\n"); }); } #endregion 监听所有命令 var fsql = freeSqlBuilder.Build(); fsql.GlobalFilter.Apply("SoftDelete", a => a.IsDeleted == false); //配置实体 DbHelper.ConfigEntity(fsql, appConfig); #region 监听Curd操作 if (dbConfig.Curd) { fsql.Aop.CurdBefore += (s, e) => { Console.WriteLine($"{e.Sql}\r\n"); }; } #endregion 监听Curd操作 #region 审计数据 //计算服务器时间 var serverTime = fsql.Select().Limit(1).First(a => DateTime.UtcNow); var timeOffset = DateTime.UtcNow.Subtract(serverTime); fsql.Aop.AuditValue += (s, e) => { DbHelper.AuditValue(e, timeOffset, user); }; #endregion 审计数据 return fsql; } } }