feat: 添加租户初始化

This commit is contained in:
橙子
2024-02-08 12:59:21 +08:00
parent 419cadfe1d
commit 64adfcceab
11 changed files with 263 additions and 73 deletions

View File

@@ -66,11 +66,20 @@ namespace Yi.Framework.SqlSugarCore.Abstractions
public static string MasterTenantDbDefaultName = "Master";
public static string TenantDbDefaultName = "Default";
/// <summary>
/// 获取默认数据库
/// </summary>
/// <returns></returns>
public SaasMultiTenancyOptions GetDefaultSaasMultiTenancy()
{
return new SaasMultiTenancyOptions { Name = TenantDbDefaultName, Url = Url };
}
public SaasMultiTenancyOptions? GetDefaultMasterSaasMultiTenancy()
/// <summary>
/// 获取主数据库
/// </summary>
/// <returns></returns>
public SaasMultiTenancyOptions? GetMasterSaasMultiTenancy()
{
if (EnabledSaasMultiTenancy == false)
{

View File

@@ -24,6 +24,9 @@ namespace Yi.Framework.SqlSugarCore
currentDb.Aop.DataExecuted = this.DataExecuted;
OnSqlSugarClientConfig(currentDb);
}
public ConnectionConfig Build(Action<ConnectionConfig>? action=null)
{
var dbConnOptions = Options;

View File

@@ -24,7 +24,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 IAbpLazyServiceProvider LazyServiceProvider { get; }
private IGuidGenerator GuidGenerator => LazyServiceProvider.LazyGetRequiredService<IGuidGenerator>();
@@ -37,7 +37,7 @@ namespace Yi.Framework.SqlSugarCore
public IEntityChangeEventHelper EntityChangeEventHelper => LazyServiceProvider.LazyGetService<IEntityChangeEventHelper>(NullEntityChangeEventHelper.Instance);
public DbConnOptions Options => LazyServiceProvider.LazyGetRequiredService<IOptions<DbConnOptions>>().Value;
private ISqlSugarDbConnectionCreator _dbConnectionCreator;
public void SetSqlSugarClient(ISqlSugarClient sqlSugarClient)
{
@@ -47,16 +47,77 @@ namespace Yi.Framework.SqlSugarCore
{
LazyServiceProvider = lazyServiceProvider;
var connectionCreator = LazyServiceProvider.LazyGetRequiredService<ISqlSugarDbConnectionCreator>();
_dbConnectionCreator = connectionCreator;
connectionCreator.OnSqlSugarClientConfig = OnSqlSugarClientConfig;
connectionCreator.EntityService = EntityService;
connectionCreator.DataExecuting = DataExecuting;
connectionCreator.DataExecuted = DataExecuted;
connectionCreator.OnLogExecuting = OnLogExecuting;
connectionCreator.OnLogExecuted = OnLogExecuted;
SqlSugarClient = new SqlSugarClient(connectionCreator.Build());
connectionCreator.SetDbAop(SqlSugarClient);
SqlSugarClient = new SqlSugarClient(connectionCreator.Build());
var connectionStringResolver = LazyServiceProvider.LazyGetRequiredService<IConnectionStringResolver>();
var connectionStr = connectionStringResolver.ResolveAsync().Result;
var changedDb = DatabaseChange(this, connectionStr);
SqlSugarClient = changedDb.SqlSugarClient;
}
/// <summary>
/// db切换多库支持
/// </summary>
/// <param name="dbContext"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
protected virtual SqlSugarDbContext DatabaseChange(SqlSugarDbContext dbContext, string connectionString)
{
string configId = string.Empty;
//没有检测到使用多租户功能,默认使用默认库即可
if (string.IsNullOrWhiteSpace(connectionString))
{
connectionString = dbContext.Options.Url;
configId = CurrentTenant.Name;
}
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, "租户主库未找到");
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;
}
/// <summary>
/// 上下文对象扩展
/// </summary>

View File

@@ -20,7 +20,7 @@ namespace Yi.Framework.SqlSugarCore.Uow
public async Task CommitAsync(CancellationToken cancellationToken = default)
{
await _sqlsugarDbContext.SqlSugarClient.Ado.CommitTranAsync();
// await _sqlsugarDbContext.SqlSugarClient.Ado.CommitTranAsync();
}
public void Dispose()
@@ -29,7 +29,7 @@ namespace Yi.Framework.SqlSugarCore.Uow
public async Task RollbackAsync(CancellationToken cancellationToken = default)
{
await _sqlsugarDbContext.SqlSugarClient.Ado.RollbackTranAsync();
// await _sqlsugarDbContext.SqlSugarClient.Ado.RollbackTranAsync();
}
}
}

View File

@@ -14,7 +14,7 @@ namespace Yi.Framework.SqlSugarCore.Uow
public class UnitOfWorkSqlsugarDbContextProvider<TDbContext> : ISugarDbContextProvider<TDbContext> where TDbContext : ISqlSugarDbContext
{
private readonly ISqlSugarDbConnectionCreator _dbConnectionCreator;
private readonly string MasterTenantDbDefaultName = DbConnOptions.MasterTenantDbDefaultName;
public ILogger<UnitOfWorkSqlsugarDbContextProvider<TDbContext>> Logger { get; set; }
public IServiceProvider ServiceProvider { get; set; }
@@ -59,11 +59,10 @@ namespace Yi.Framework.SqlSugarCore.Uow
ContextInstance.Current = (TDbContext)ServiceProvider.GetRequiredService<ISqlSugarDbContext>();
}
var dbContext = (TDbContext)ContextInstance.Current;
var output = DatabaseChange(dbContext, connectionStringName, connectionString);
//提高体验,取消工作单元强制性
//throw new AbpException("A DbContext can only be created inside a unit of work!");
//如果不启用工作单元创建一个新的db不开启事务即可
return output;
return dbContext;
}
@@ -100,64 +99,10 @@ namespace Yi.Framework.SqlSugarCore.Uow
using (SqlSugarDbContextCreationContext.Use(creationContext))
{
var dbContext = await CreateDbContextAsync(unitOfWork);
//获取到DB之后对多租户多库进行处理
var changedDbContext = DatabaseChange(dbContext, connectionStringName, connectionString);
return changedDbContext;
return dbContext;
}
}
protected virtual TDbContext DatabaseChange(TDbContext dbContext, string configId, string connectionString)
{
//没有检测到使用多租户功能,默认使用默认库即可
if (string.IsNullOrWhiteSpace(connectionString))
{
connectionString = dbContext.Options.Url;
configId = DbConnOptions.TenantDbDefaultName;
}
var dbOption = dbContext.Options;
var db = dbContext.SqlSugarClient.AsTenant();
//主库的Db切换当操作的是租户表的时候
if (CurrentTenant.Name == MasterTenantDbDefaultName)
{
//直接切换
configId = MasterTenantDbDefaultName;
var conStrOrNull = dbOption.GetDefaultMasterSaasMultiTenancy();
Volo.Abp.Check.NotNull(conStrOrNull, "租户主库未找到");
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;
}
protected virtual async Task<TDbContext> CreateDbContextAsync(IUnitOfWork unitOfWork)
{
return unitOfWork.Options.IsTransactional
@@ -182,7 +127,7 @@ namespace Yi.Framework.SqlSugarCore.Uow
);
unitOfWork.AddTransactionApi(transactionApiKey, transaction);
await dbContext.SqlSugarClient.Ado.BeginTranAsync();
// await dbContext.SqlSugarClient.Ado.BeginTranAsync();
return dbContext;
}
else