From 38bfc87fc19cf8359c11c0f5fe10eb64be4a0473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sun, 7 Jul 2024 00:59:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84sass=E5=A4=9A?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=EF=BC=8C=E6=94=AF=E6=8C=81=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SqlSugarDbContext.cs | 53 +++++++++++++++++- .../UnitOfWorkSqlsugarDbContextProvider.cs | 9 +-- ...=> SqlSugarAndConfigurationTenantStore.cs} | 48 +++++++++++----- ...YiFrameworkTenantManagementDomainModule.cs | 2 +- .../YiTenantConfigurationProvider.cs | 2 + Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db | Bin 487424 -> 0 bytes 6 files changed, 91 insertions(+), 23 deletions(-) rename Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/{SqlSugarTenantStore.cs => SqlSugarAndConfigurationTenantStore.cs} (69%) delete mode 100644 Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs index 76a032e3..46427f65 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; +using System.Reflection; using System.Security.Policy; using System.Text; using Microsoft.Extensions.DependencyInjection; @@ -37,7 +38,7 @@ namespace Yi.Framework.SqlSugarCore public IEntityChangeEventHelper EntityChangeEventHelper => LazyServiceProvider.LazyGetService(NullEntityChangeEventHelper.Instance); public DbConnOptions Options => LazyServiceProvider.LazyGetRequiredService>().Value; - public AbpDbConnectionOptions ConnectionOptions=> LazyServiceProvider.LazyGetRequiredService>().Value; + public AbpDbConnectionOptions ConnectionOptions => LazyServiceProvider.LazyGetRequiredService>().Value; private ISqlSugarDbConnectionCreator _dbConnectionCreator; public void SetSqlSugarClient(ISqlSugarClient sqlSugarClient) @@ -56,9 +57,11 @@ namespace Yi.Framework.SqlSugarCore connectionCreator.OnLogExecuting = OnLogExecuting; connectionCreator.OnLogExecuted = OnLogExecuted; var currentConnection = GetCurrentConnectionString(); + var currentDbType = GetCurrentDbType(); SqlSugarClient = new SqlSugarClient(connectionCreator.Build(action: options => { options.ConnectionString = currentConnection; + })); connectionCreator.SetDbAop(SqlSugarClient); } @@ -78,7 +81,7 @@ namespace Yi.Framework.SqlSugarCore //开启了多租户 var connectionStringResolver = LazyServiceProvider.LazyGetRequiredService(); - var connectionString = connectionStringResolver.ResolveAsync().Result; + var connectionString = connectionStringResolver.ResolveAsync().GetAwaiter().GetResult(); //没有检测到使用多租户功能,默认使用默认库即可 @@ -90,6 +93,50 @@ namespace Yi.Framework.SqlSugarCore return connectionString!; } + protected virtual DbType GetCurrentDbType() + { + if (CurrentTenant.Name is not null) + { + var dbTypeFromTenantName = GetDbTypeFromTenantName(CurrentTenant.Name); + if (dbTypeFromTenantName is not null) + { + return dbTypeFromTenantName.Value; + } + } + Volo.Abp.Check.NotNull(Options.DbType, "默认DbType未配置!"); + return Options.DbType!.Value; + } + + //根据租户name进行匹配db类型: Test_Sqlite,[来自AI] + private DbType? GetDbTypeFromTenantName(string name) + { + if (string.IsNullOrWhiteSpace(name)) + { + return null; + } + + // 查找下划线的位置 + int underscoreIndex = name.LastIndexOf('_'); + + if (underscoreIndex == -1 || underscoreIndex == name.Length - 1) + { + return null; + } + + // 提取 枚举 部分 + string enumString = name.Substring(underscoreIndex + 1); + + // 尝试将 尾缀 转换为枚举 + if (Enum.TryParse(enumString, out DbType result)) + { + return result; + } + + // 条件不满足时返回 null + return null; + } + + /// /// 上下文对象扩展 diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Uow/UnitOfWorkSqlsugarDbContextProvider.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Uow/UnitOfWorkSqlsugarDbContextProvider.cs index f96e7e81..09a660bc 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Uow/UnitOfWorkSqlsugarDbContextProvider.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/Uow/UnitOfWorkSqlsugarDbContextProvider.cs @@ -14,7 +14,7 @@ namespace Yi.Framework.SqlSugarCore.Uow public class UnitOfWorkSqlsugarDbContextProvider : ISugarDbContextProvider where TDbContext : ISqlSugarDbContext { private readonly ISqlSugarDbConnectionCreator _dbConnectionCreator; - + public ILogger> Logger { get; set; } public IServiceProvider ServiceProvider { get; set; } @@ -64,8 +64,7 @@ namespace Yi.Framework.SqlSugarCore.Uow - //lock (_databaseApiLock) - //{ + //尝试当前工作单元获取db var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey); @@ -74,7 +73,7 @@ namespace Yi.Framework.SqlSugarCore.Uow { //db根据连接字符串来创建 databaseApi = new SqlSugarDatabaseApi( - CreateDbContextAsync(unitOfWork, connectionStringName, connectionString).Result + await CreateDbContextAsync(unitOfWork, connectionStringName, connectionString) ); //await Console.Out.WriteLineAsync(">>>----------------实例化了db"+ ((SqlSugarDatabaseApi)databaseApi).DbContext.SqlSugarClient.ContextID.ToString()); @@ -83,8 +82,6 @@ namespace Yi.Framework.SqlSugarCore.Uow } return (TDbContext)((SqlSugarDatabaseApi)databaseApi).DbContext; - //} - } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/SqlSugarTenantStore.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/SqlSugarAndConfigurationTenantStore.cs similarity index 69% rename from Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/SqlSugarTenantStore.cs rename to Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/SqlSugarAndConfigurationTenantStore.cs index 34750ce5..f5bfaa52 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/SqlSugarTenantStore.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/SqlSugarAndConfigurationTenantStore.cs @@ -1,42 +1,64 @@ -using JetBrains.Annotations; +using System.Xml.Linq; +using JetBrains.Annotations; +using Microsoft.Extensions.Options; using Volo.Abp; using Volo.Abp.Caching; using Volo.Abp.Data; using Volo.Abp.MultiTenancy; +using Volo.Abp.MultiTenancy.ConfigurationStore; namespace Yi.Framework.TenantManagement.Domain { - public class SqlSugarTenantStore : ITenantStore + public class SqlSugarAndConfigurationTenantStore : DefaultTenantStore, ITenantStore { private ISqlSugarTenantRepository TenantRepository { get; } protected ICurrentTenant CurrentTenant { get; } protected IDistributedCache Cache { get; } - public SqlSugarTenantStore(ISqlSugarTenantRepository repository, + public SqlSugarAndConfigurationTenantStore(ISqlSugarTenantRepository repository, IDistributedCache cache, - ICurrentTenant currentTenant) - { TenantRepository = repository; - Cache=cache; - CurrentTenant=currentTenant; + ICurrentTenant currentTenant, + IOptionsMonitor options) : base(options) + { + TenantRepository = repository; + Cache = cache; + CurrentTenant = currentTenant; } - public TenantConfiguration? Find(string name) + public new TenantConfiguration? Find(string name) { throw new NotImplementedException("请使用异步方法"); } - public TenantConfiguration? Find(Guid id) + public new TenantConfiguration? Find(Guid id) { throw new NotImplementedException("请使用异步方法"); } - public async Task FindAsync(string name) + public new async Task FindAsync(string name) { - return (await GetCacheItemAsync(null, name)).Value; + var tenantFromOptions = await base.FindAsync(name); + //如果配置文件不存在改租户 + if (tenantFromOptions is null) + { + return (await GetCacheItemAsync(null, name)).Value; + } + else + { + return tenantFromOptions; + } } - public async Task FindAsync(Guid id) + public new async Task FindAsync(Guid id) { - return (await GetCacheItemAsync(id, null)).Value; + var tenantFromOptions = await base.FindAsync(id); + if (tenantFromOptions is null) + { + return (await GetCacheItemAsync(id, null)).Value; + } + else + { + return tenantFromOptions; + } } 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 87301d07..3a359b3e 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 @@ -16,7 +16,7 @@ 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(SqlSugarAndConfigurationTenantStore), ServiceLifetime.Transient)); services.Replace(new ServiceDescriptor(typeof(IConnectionStringResolver), typeof(YiMultiTenantConnectionStringResolver), ServiceLifetime.Transient)); } diff --git a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiTenantConfigurationProvider.cs b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiTenantConfigurationProvider.cs index 0914e47c..bb5852d4 100644 --- a/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiTenantConfigurationProvider.cs +++ b/Yi.Abp.Net8/module/tenant-management/Yi.Framework.TenantManagement.Domain/YiTenantConfigurationProvider.cs @@ -26,6 +26,7 @@ public class YiTenantConfigurationProvider : ITenantConfigurationProvider, ITran public virtual async Task GetAsync(bool saveResolveResult = false) { + //租户解析器获取到当前解析成功的租户 var resolveResult = await TenantResolver.ResolveTenantIdOrNameAsync(); if (saveResolveResult) @@ -36,6 +37,7 @@ public class YiTenantConfigurationProvider : ITenantConfigurationProvider, ITran TenantConfiguration? tenant = null; if (resolveResult.TenantIdOrName != null) { + //根据租户信息获取租户 tenant = await FindTenantAsync(resolveResult.TenantIdOrName); if (tenant == null) diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db b/Yi.Abp.Net8/src/Yi.Abp.Web/yi-abp-dev.db deleted file mode 100644 index 6c2ef117dfc9790cb1d48040a5d9cafced4ba500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487424 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

C7RBEUdF1e7oh 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