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