Parcourir la source

获得FreeSql实例优化

zhontai il y a 3 ans
Parent
commit
0742f8566e

+ 23 - 0
Admin.Core.Repository/Admin/Tenant/Dto/CreateFreeSqlTenantDto.cs

@@ -0,0 +1,23 @@
+
+using FreeSql;
+
+namespace Admin.Core.Repository.Admin.Tenant.Dto
+{
+    public class CreateFreeSqlTenantDto
+    {
+        /// <summary>
+        /// 数据库
+        /// </summary>
+        public DataType? DbType { get; set; }
+
+        /// <summary>
+        /// 连接字符串
+        /// </summary>
+        public string ConnectionString { get; set; }
+
+        /// <summary>
+        /// 空闲时间(分)
+        /// </summary>
+        public int? IdleTime { get; set; }
+    }
+}

+ 74 - 75
Admin.Core.Repository/Base/IdleBusExtesions.cs

@@ -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);
         }
     }
 }