using Microsoft.Extensions.DependencyInjection; using System; using StackExchange.Profiling; using FreeSql; using ZhonTai.Admin.Core.Auth; using ZhonTai.Admin.Core.Configs; using ZhonTai.Admin.Core.Dto; using ZhonTai.Admin.Core.Entities; using ZhonTai.Admin.Domain.Tenant; using ZhonTai.Admin.Core.Consts; namespace ZhonTai.Admin.Core.Db; public static class FreeSqlCloudExtesions { /// /// 创建FreeSql实例 /// /// /// /// /// /// private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, DbConfig dbConfig, CreateFreeSqlTenantDto tenant) { 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.ApplyOnly(FilterNames.Delete, a => a.IsDeleted == false); //配置实体 DbHelper.ConfigEntity(fsql, appConfig); #region 监听Curd操作 if (dbConfig.Curd) { fsql.Aop.CurdBefore += (s, e) => { if (appConfig.MiniProfiler) { MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql); } Console.WriteLine($"{e.Sql}\r\n"); }; fsql.Aop.CurdAfter += (s, e) => { if (appConfig.MiniProfiler) { MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}"); } Console.WriteLine($"{e.Sql}\r\n"); }; } #endregion 监听Curd操作 #region 审计数据 //计算服务器时间 var serverTime = fsql.Ado.QuerySingle(() => DateTime.UtcNow); var timeOffset = DateTime.UtcNow.Subtract(serverTime); fsql.Aop.AuditValue += (s, e) => { DbHelper.AuditValue(e, timeOffset, user); }; #endregion 审计数据 if (appConfig.Tenant) { fsql.GlobalFilter.ApplyOnly(FilterNames.Tenant, a => a.TenantId == user.TenantId); } return fsql; } /// /// 获得当前登录用户数据库 /// /// /// /// public static IFreeSql GetCurrentDb(this FreeSqlCloud cloud, IServiceProvider serviceProvider) { var user = serviceProvider.GetRequiredService(); var appConfig = serviceProvider.GetRequiredService(); var tenantId = user.TenantId; if (appConfig.Tenant && tenantId.HasValue) { var dbKey = user.DbKey.NotNull() ? user.DbKey : (DbKeys.TenantDb + tenantId); var exists = cloud.ExistsRegister(dbKey); if (!exists) { var dbConfig = serviceProvider.GetRequiredService(); var tenantRepository = serviceProvider.GetRequiredService(); var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne(); cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant)); } return cloud.Use(dbKey); } else { var masterDb = cloud.Use(DbKeys.MasterDb); return masterDb; } } /// /// 获得租户数据库 /// /// /// /// /// public static IFreeSql GetTenantDb(this FreeSqlCloud cloud, IServiceProvider serviceProvider, long? tenantId = null) { if (!tenantId.HasValue) { return null; } var tenantRepository = serviceProvider.GetRequiredService(); var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne(); var dbKey = tenant.DbKey.NotNull() ? tenant.DbKey : (DbKeys.TenantDb + tenantId); var exists = cloud.ExistsRegister(dbKey); if (!exists) { var user = serviceProvider.GetRequiredService(); var dbConfig = serviceProvider.GetRequiredService(); var appConfig = serviceProvider.GetRequiredService(); cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant)); } return cloud.Use(dbKey); } }