diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/DbConnOptions.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/DbConnOptions.cs index e8044cdf..8ad3c5d4 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/DbConnOptions.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore.Abstractions/DbConnOptions.cs @@ -63,8 +63,8 @@ namespace Yi.Framework.SqlSugarCore.Abstractions /// public List? SaasMultiTenancy { get; set; } - public static string MasterTenantDbDefaultName = "Master"; - public static string TenantDbDefaultName = "Default"; + public static string MasterTenantName = "Master"; + public static string DefaultTenantName = "Default"; /// /// 获取默认数据库 @@ -72,7 +72,7 @@ namespace Yi.Framework.SqlSugarCore.Abstractions /// public SaasMultiTenancyOptions GetDefaultSaasMultiTenancy() { - return new SaasMultiTenancyOptions { Name = TenantDbDefaultName, Url = Url }; + return new SaasMultiTenancyOptions { Name = DefaultTenantName, Url = Url }; } /// @@ -88,13 +88,13 @@ namespace Yi.Framework.SqlSugarCore.Abstractions if (string.IsNullOrEmpty(MasterSaasMultiTenancyUrl)) { - return new SaasMultiTenancyOptions { Name = MasterTenantDbDefaultName, Url = Url }; + return new SaasMultiTenancyOptions { Name = MasterTenantName, Url = Url }; } else { return new SaasMultiTenancyOptions() { - Name = MasterTenantDbDefaultName, + Name = MasterTenantName, Url = MasterSaasMultiTenancyUrl }; } diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs index 6b57fcd6..a2b5016c 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs @@ -1,4 +1,5 @@ using System.Reflection; +using System.Security.Policy; using System.Text; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -24,7 +25,7 @@ namespace Yi.Framework.SqlSugarCore /// public ISqlSugarClient SqlSugarClient { get; private set; } public ICurrentUser CurrentUser => LazyServiceProvider.GetRequiredService(); - private readonly string MasterTenantDbDefaultName = DbConnOptions.MasterTenantDbDefaultName; + private readonly string MasterTenantDbDefaultName = DbConnOptions.MasterTenantName; private IAbpLazyServiceProvider LazyServiceProvider { get; } private IGuidGenerator GuidGenerator => LazyServiceProvider.LazyGetRequiredService(); @@ -54,67 +55,36 @@ namespace Yi.Framework.SqlSugarCore connectionCreator.DataExecuted = DataExecuted; connectionCreator.OnLogExecuting = OnLogExecuting; connectionCreator.OnLogExecuted = OnLogExecuted; - SqlSugarClient = new SqlSugarClient(connectionCreator.Build()); - var connectionStringResolver = LazyServiceProvider.LazyGetRequiredService(); - var connectionStr = connectionStringResolver.ResolveAsync().Result; - var changedDb = DatabaseChange(this, connectionStr); - SqlSugarClient = changedDb.SqlSugarClient; + var currentConnection = GetCurrentConnectionString(); + SqlSugarClient = new SqlSugarClient(connectionCreator.Build(action: options => + { + options.ConnectionString = currentConnection; + })); } /// /// db切换多库支持 /// - /// - /// /// - protected virtual SqlSugarDbContext DatabaseChange(SqlSugarDbContext dbContext, string connectionString) + protected virtual string GetCurrentConnectionString() { - string configId = string.Empty; + var connectionStringResolver = LazyServiceProvider.LazyGetRequiredService(); + var connectionString = connectionStringResolver.ResolveAsync().Result; + //没有检测到使用多租户功能,默认使用默认库即可 if (string.IsNullOrWhiteSpace(connectionString)) { - connectionString = dbContext.Options.Url; - configId = CurrentTenant.Name; + Volo.Abp.Check.NotNull(Options.Url, "租户默认库Defalut未找到"); + connectionString = Options.Url; } - - var dbOption = dbContext.Options; - var db = dbContext.SqlSugarClient.AsTenant(); - - //主库的Db切换,当操作的是租户表的时候 + //如果当前租户是主库,单独使用主要库 if (CurrentTenant.Name == MasterTenantDbDefaultName) { - //直接切换 - configId = MasterTenantDbDefaultName; - var conStrOrNull = dbOption.GetMasterSaasMultiTenancy(); - Volo.Abp.Check.NotNull(conStrOrNull, "租户主库未找到"); + var conStrOrNull = Options.GetMasterSaasMultiTenancy(); + Volo.Abp.Check.NotNull(conStrOrNull, "租户主库Master未找到"); connectionString = conStrOrNull.Url; } - - //租户Db的动态切换 - //二级缓存 - var changed = false; - if (!db.IsAnyConnection(configId)) - { - var config = _dbConnectionCreator.Build(options => - { - options.DbType = dbOption.DbType!.Value; - options.ConfigId = configId;//设置库的唯一标识 - options.IsAutoCloseConnection = true; - options.ConnectionString = connectionString; - }); - //添加一个db到当前上下文 (Add部分不线上下文不会共享) - db.AddConnection(config); - changed = true; - } - var currentDb = db.GetConnection(configId) as ISqlSugarClient; - //设置Aop - if (changed) - { - _dbConnectionCreator.SetDbAop(currentDb); - } - dbContext.SetSqlSugarClient(currentDb); - - return dbContext; + return connectionString!; } diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Consts/UserConst.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Consts/UserConst.cs index 8e226350..be437ab0 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Consts/UserConst.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Consts/UserConst.cs @@ -20,10 +20,15 @@ namespace Yi.Framework.Rbac.Domain.Shared.Consts public const string No_Permission = "登录禁用!该用户分配无任何权限,无意义登录!"; public const string No_Role = "登录禁用!该用户分配无任何角色,无意义登录!"; + //子租户管理员 public const string Admin = "cc"; public const string AdminRolesCode = "admin"; public const string AdminPermissionCode = "*:*:*"; + //租户管理员 + public const string TenantAdmin = "ccadmin"; + public const string TenantAdminPermissionCode = "*"; + public const string DefaultRoleCode = "default"; public const string CommonRoleName = "common"; } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application/TenantService.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application/TenantService.cs index 87739eac..d08b7b98 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application/TenantService.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Application/TenantService.cs @@ -110,7 +110,7 @@ namespace Yi.Framework.TenantManagement.Application [HttpPut("tenant/init/{id}")] public async Task InitAsync([FromRoute]Guid id) { - using (CurrentTenant.Change(id,"test")) + using (CurrentTenant.Change(id)) { await CodeFirst(this.LazyServiceProvider); await _dataSeeder.SeedAsync(id); diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/TenantManagementExtensions.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/TenantManagementExtensions.cs index ec37f404..dbe47fa1 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/TenantManagementExtensions.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/TenantManagementExtensions.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Volo.Abp.MultiTenancy; +using Volo.Abp.MultiTenancy; using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Framework.TenantManagement.Domain @@ -12,7 +7,12 @@ namespace Yi.Framework.TenantManagement.Domain { public static IDisposable ChangeMaster(this ICurrentTenant currentTenant) { - return currentTenant.Change(null, DbConnOptions.MasterTenantDbDefaultName); + return currentTenant.Change(null, DbConnOptions.MasterTenantName); + } + + public static IDisposable ChangeDefalut(this ICurrentTenant currentTenant) + { + return currentTenant.Change(null, DbConnOptions.DefaultTenantName); } } } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiFrameworkTenantManagementDomainModule.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiFrameworkTenantManagementDomainModule.cs index 6912b097..87301d07 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiFrameworkTenantManagementDomainModule.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiFrameworkTenantManagementDomainModule.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Volo.Abp.Data; using Volo.Abp.Domain; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; @@ -15,7 +16,9 @@ namespace Yi.Framework.TenantManagement.Domain public override void ConfigureServices(ServiceConfigurationContext context) { var services = context.Services; - services.Replace(new ServiceDescriptor(typeof(ITenantStore),typeof(SqlSugarTenantStore), ServiceLifetime.Transient)); + services.Replace(new ServiceDescriptor(typeof(ITenantStore), typeof(SqlSugarTenantStore), ServiceLifetime.Transient)); + + services.Replace(new ServiceDescriptor(typeof(IConnectionStringResolver), typeof(YiMultiTenantConnectionStringResolver), ServiceLifetime.Transient)); } } } diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/DefaultConnectionStringResolver2.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiMultiTenantConnectionStringResolver.cs similarity index 97% rename from Yi.Abp.Net8/src/Yi.Abp.Web/DefaultConnectionStringResolver2.cs rename to Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiMultiTenantConnectionStringResolver.cs index a285d577..30b21076 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Web/DefaultConnectionStringResolver2.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiMultiTenantConnectionStringResolver.cs @@ -9,12 +9,12 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.MultiTenancy; [Dependency(ReplaceServices = true)] -public class MultiTenantConnectionStringResolver2 : DefaultConnectionStringResolver +public class YiMultiTenantConnectionStringResolver : DefaultConnectionStringResolver { private readonly ICurrentTenant _currentTenant; private readonly IServiceProvider _serviceProvider; - public MultiTenantConnectionStringResolver2( + public YiMultiTenantConnectionStringResolver( IOptionsMonitor options, ICurrentTenant currentTenant, IServiceProvider serviceProvider) diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs b/Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs index f8c9f615..0feeab19 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs +++ b/Yi.Abp.Net8/src/Yi.Abp.Web/Program.cs @@ -1,8 +1,5 @@ -using Microsoft.Extensions.DependencyInjection.Extensions; using Serilog; using Serilog.Events; -using Volo.Abp.Data; -using Volo.Abp.MultiTenancy; using Yi.Abp.Web; //创建日志,可使用{SourceContext}记录 @@ -26,7 +23,6 @@ try builder.Host.UseAutofac(); builder.Host.UseSerilog(); await builder.Services.AddApplicationAsync(); - builder.Services.Replace(new ServiceDescriptor(typeof(IConnectionStringResolver), typeof(MultiTenantConnectionStringResolver2),ServiceLifetime.Transient)); var app = builder.Build(); await app.InitializeApplicationAsync(); await app.RunAsync(); diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/yi-test.db b/Yi.Abp.Net8/src/Yi.Abp.Web/yi-test.db deleted file mode 100644 index 7d73f400..00000000 Binary files a/Yi.Abp.Net8/src/Yi.Abp.Web/yi-test.db and /dev/null differ diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/yi-test2.db b/Yi.Abp.Net8/src/Yi.Abp.Web/yi-test2.db index c88deb02..deac314a 100644 Binary files a/Yi.Abp.Net8/src/Yi.Abp.Web/yi-test2.db and b/Yi.Abp.Net8/src/Yi.Abp.Web/yi-test2.db differ