Jelajahi Sumber

优化租户数据库创建和获取

zhontai 2 tahun lalu
induk
melakukan
f1041274aa

+ 0 - 6
src/platform/ZhonTai.Admin/Core/Attributes/TransactionAttribute.cs

@@ -1,7 +1,6 @@
 using FreeSql;
 using System;
 using System.Data;
-using ZhonTai.Admin.Core.Consts;
 
 namespace ZhonTai.Admin.Core.Attributes;
 
@@ -21,9 +20,4 @@ public class TransactionAttribute : Attribute
     /// </summary>
     public IsolationLevel IsolationLevel { get; set; }
 
-    /// <summary>
-    /// 数据库键
-    /// </summary>
-    public string DbKey { get; set; } = DbKeys.MasterDb;
-
 }

+ 39 - 20
src/platform/ZhonTai.Admin/Core/Db/FreeSqlCloudExtesions.cs

@@ -23,6 +23,14 @@ public static class FreeSqlCloudExtesions
     /// <returns></returns>
     private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, DbConfig dbConfig, CreateFreeSqlTenantDto tenant)
     {
+        if(tenant == null)
+        {
+            tenant = new CreateFreeSqlTenantDto
+            {
+                DbType = dbConfig.Type,
+                ConnectionString = dbConfig.ConnectionString
+            };
+        }
         var freeSqlBuilder = new FreeSqlBuilder()
         .UseConnectionString(tenant.DbType.Value, tenant.ConnectionString)
         .UseAutoSyncStructure(false)
@@ -42,8 +50,16 @@ public static class FreeSqlCloudExtesions
         #endregion 监听所有命令
 
         var fsql = freeSqlBuilder.Build();
+
+        //软删除过滤器
         fsql.GlobalFilter.ApplyOnly<IDelete>(FilterNames.Delete, a => a.IsDeleted == false);
 
+        //租户过滤器
+        if (appConfig.Tenant)
+        {
+            fsql.GlobalFilter.ApplyOnlyIf<ITenant>(FilterNames.Tenant, () => user?.Id > 0, a => a.TenantId == user.TenantId);
+        }
+
         //配置实体
         DbHelper.ConfigEntity(fsql, appConfig);
 
@@ -83,12 +99,22 @@ public static class FreeSqlCloudExtesions
 
         #endregion 审计数据
 
-        if (appConfig.Tenant)
+        return fsql;
+    }
+
+    public static string GetDbKey(this FreeSqlCloud _, IServiceProvider serviceProvider)
+    {
+        var user = serviceProvider.GetRequiredService<IUser>();
+        var appConfig = serviceProvider.GetRequiredService<AppConfig>();
+        var tenantId = user.TenantId;
+        if (appConfig.Tenant && tenantId.HasValue)
         {
-            fsql.GlobalFilter.ApplyOnly<ITenant>(FilterNames.Tenant, a => a.TenantId == user.TenantId);
+            return user.DbKey.NotNull() ? user.DbKey : (DbKeys.TenantDb + tenantId);
+        }
+        else
+        {
+            return DbKeys.MasterDb;
         }
-
-        return fsql;
     }
 
     /// <summary>
@@ -103,25 +129,18 @@ public static class FreeSqlCloudExtesions
         var appConfig = serviceProvider.GetRequiredService<AppConfig>();
 
         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<DbConfig>();
-                var tenantRepository = serviceProvider.GetRequiredService<ITenantRepository>();
-                var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne<CreateFreeSqlTenantDto>();
-                cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant));
-            }
+        var dbKey = GetDbKey(cloud, serviceProvider);
+        var exists = cloud.ExistsRegister(dbKey);
 
-            return cloud.Use(dbKey);
-        }
-        else
+        if (!exists)
         {
-            var masterDb = cloud.Use(DbKeys.MasterDb);
-            return masterDb;
+            var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
+            var tenantRepository = serviceProvider.GetRequiredService<ITenantRepository>();
+            var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne<CreateFreeSqlTenantDto>();
+            cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant));
         }
+
+        return cloud.Use(dbKey);
     }
 
     /// <summary>

+ 8 - 3
src/platform/ZhonTai.Admin/Core/Db/Transaction/TransactionAsyncInterceptor.cs

@@ -1,4 +1,5 @@
-using System.Data;
+using System;
+using System.Data;
 using System.Linq;
 using System.Threading.Tasks;
 using Castle.DynamicProxy;
@@ -12,10 +13,14 @@ public class TransactionAsyncInterceptor : IAsyncInterceptor
 {
     private IUnitOfWork _unitOfWork;
     private readonly UnitOfWorkManagerCloud _unitOfWorkManagerCloud;
+    private readonly FreeSqlCloud _freeSqlCloud;
+    private readonly IServiceProvider _serviceProvider;
 
-    public TransactionAsyncInterceptor(UnitOfWorkManagerCloud unitOfWorkManagerCloud)
+    public TransactionAsyncInterceptor(UnitOfWorkManagerCloud unitOfWorkManagerCloud, FreeSqlCloud freeSqlCloud, IServiceProvider serviceProvider)
     {
         _unitOfWorkManagerCloud = unitOfWorkManagerCloud;
+        _freeSqlCloud = freeSqlCloud;
+        _serviceProvider = serviceProvider;
     }
 
     private bool TryBegin(IInvocation invocation)
@@ -26,7 +31,7 @@ public class TransactionAsyncInterceptor : IAsyncInterceptor
         {
             IsolationLevel? isolationLevel = transaction.IsolationLevel == 0 ? null : transaction.IsolationLevel;
 
-            _unitOfWork = _unitOfWorkManagerCloud.Begin(transaction.DbKey, transaction.Propagation, isolationLevel);
+            _unitOfWork = _unitOfWorkManagerCloud.Begin(_freeSqlCloud.GetDbKey(_serviceProvider), transaction.Propagation, isolationLevel);
             return true;
         }
 

+ 0 - 5
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -34,11 +34,6 @@
             事务隔离级别
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Core.Attributes.TransactionAttribute.DbKey">
-            <summary>
-            数据库键
-            </summary>
-        </member>
         <member name="T:ZhonTai.Admin.Core.Attributes.ValidateInputAttribute">
             <summary>
             输入模型验证