feat: 完成db创建优化

This commit is contained in:
橙子
2024-02-08 17:32:28 +08:00
parent 64adfcceab
commit 39d472bdc8
10 changed files with 41 additions and 67 deletions

View File

@@ -63,8 +63,8 @@ namespace Yi.Framework.SqlSugarCore.Abstractions
/// </summary>
public List<SaasMultiTenancyOptions>? SaasMultiTenancy { get; set; }
public static string MasterTenantDbDefaultName = "Master";
public static string TenantDbDefaultName = "Default";
public static string MasterTenantName = "Master";
public static string DefaultTenantName = "Default";
/// <summary>
/// 获取默认数据库
@@ -72,7 +72,7 @@ namespace Yi.Framework.SqlSugarCore.Abstractions
/// <returns></returns>
public SaasMultiTenancyOptions GetDefaultSaasMultiTenancy()
{
return new SaasMultiTenancyOptions { Name = TenantDbDefaultName, Url = Url };
return new SaasMultiTenancyOptions { Name = DefaultTenantName, Url = Url };
}
/// <summary>
@@ -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
};
}

View File

@@ -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
/// </summary>
public ISqlSugarClient SqlSugarClient { get; private set; }
public ICurrentUser CurrentUser => LazyServiceProvider.GetRequiredService<ICurrentUser>();
private readonly string MasterTenantDbDefaultName = DbConnOptions.MasterTenantDbDefaultName;
private readonly string MasterTenantDbDefaultName = DbConnOptions.MasterTenantName;
private IAbpLazyServiceProvider LazyServiceProvider { get; }
private IGuidGenerator GuidGenerator => LazyServiceProvider.LazyGetRequiredService<IGuidGenerator>();
@@ -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<IConnectionStringResolver>();
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;
}));
}
/// <summary>
/// db切换多库支持
/// </summary>
/// <param name="dbContext"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
protected virtual SqlSugarDbContext DatabaseChange(SqlSugarDbContext dbContext, string connectionString)
protected virtual string GetCurrentConnectionString()
{
string configId = string.Empty;
var connectionStringResolver = LazyServiceProvider.LazyGetRequiredService<IConnectionStringResolver>();
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!;
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -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<AbpDbConnectionOptions> options,
ICurrentTenant currentTenant,
IServiceProvider serviceProvider)

View File

@@ -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<YiAbpWebModule>();
builder.Services.Replace(new ServiceDescriptor(typeof(IConnectionStringResolver), typeof(MultiTenantConnectionStringResolver2),ServiceLifetime.Transient));
var app = builder.Build();
await app.InitializeApplicationAsync();
await app.RunAsync();