feat: 完成多租户saas框架搭建

This commit is contained in:
橙子
2024-01-21 18:11:04 +08:00
parent 68c1d59638
commit 2013aa5db8
19 changed files with 295 additions and 266 deletions

View File

@@ -18,7 +18,7 @@ namespace Yi.Framework.SqlSugarCore.Uow
{
public class UnitOfWorkSqlsugarDbContextProvider<TDbContext> : ISugarDbContextProvider<TDbContext> where TDbContext : ISqlSugarDbContext
{
private readonly string MasterTenantDbDefaultName = DbConnOptions.MasterTenantDbDefaultName;
public ILogger<UnitOfWorkSqlsugarDbContextProvider<TDbContext>> Logger { get; set; }
protected readonly IUnitOfWorkManager UnitOfWorkManager;
@@ -47,17 +47,12 @@ namespace Yi.Framework.SqlSugarCore.Uow
if (unitOfWork == null)
{
UnitOfWorkManager.Begin(true);
unitOfWork=UnitOfWorkManager.Current;
unitOfWork = UnitOfWorkManager.Current;
//取消工作单元强制性
//throw new AbpException("A DbContext can only be created inside a unit of work!");
}
//var sss= unitOfWork.ServiceProvider.GetRequiredService<TDbContext>();
//Console.WriteLine("反户的:"+sss.SqlSugarClient.ContextID);
//return sss;
]
var connectionStringName = "Default";
var connectionString = await ResolveConnectionStringAsync(null);
var connectionStringName = ConnectionStrings.DefaultConnectionStringName;
var connectionString = await ResolveConnectionStringAsync(connectionStringName);
// var dbContextKey = $"{this.GetType().FullName}_{connectionString}";
var dbContextKey = "Default";
var databaseApi = unitOfWork.FindDatabaseApi(dbContextKey);
@@ -77,12 +72,56 @@ namespace Yi.Framework.SqlSugarCore.Uow
protected virtual async Task<TDbContext> CreateDbContextAsync(IUnitOfWork unitOfWork, string connectionStringName, string connectionString)
{
var dbContext = await CreateDbContextAsync(unitOfWork);
// Console.WriteLine("111111" + dbContext.SqlSugarClient.ContextID);
//没有检测到使用多租户功能,默认使用默认库即可
if (string.IsNullOrWhiteSpace(connectionString))
{
connectionString = dbContext.Options.Url;
connectionStringName = DbConnOptions.TenantDbDefaultName;
}
//获取到DB之后对多租户多库进行处理
var changedDbContext = DatabaseChange(dbContext, connectionStringName, connectionString);
return changedDbContext;
}
protected virtual TDbContext DatabaseChange(TDbContext dbContext, string configId, string connectionString)
{
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的动态切换
//二级缓存
if (!db.IsAnyConnection(configId))
{
//添加一个db到当前上下文 (Add部分不线上下文不会共享)
db.AddConnection(new ConnectionConfig()
{
DbType = dbOption.DbType!.Value,
ConfigId = configId,//设置库的唯一标识
IsAutoCloseConnection = true,
ConnectionString = connectionString
});
}
var currentDb = db.GetConnection(configId) as ISqlSugarClient;
dbContext.SetSqlSugarClient(currentDb);
return dbContext;
}
protected virtual async Task<TDbContext> CreateDbContextAsync(IUnitOfWork unitOfWork)
{
return unitOfWork.ServiceProvider.GetRequiredService<TDbContext>();
@@ -92,22 +131,22 @@ namespace Yi.Framework.SqlSugarCore.Uow
}
protected virtual async Task<TDbContext> CreateDbContextWithTransactionAsync(IUnitOfWork unitOfWork)
{
var transactionApiKey = $"Sqlsugar_Default"+Guid.NewGuid().ToString();
var transactionApiKey = $"Sqlsugar_Default" + Guid.NewGuid().ToString();
var activeTransaction = unitOfWork.FindTransactionApi(transactionApiKey) as SqlSugarTransactionApi;
//if (activeTransaction==null|| activeTransaction.Equals(default(SqlSugarTransactionApi)))
//{
var dbContext = unitOfWork.ServiceProvider.GetRequiredService<TDbContext>();
var transaction = new SqlSugarTransactionApi(
dbContext
);
unitOfWork.AddTransactionApi(transactionApiKey, transaction);
var dbContext = unitOfWork.ServiceProvider.GetRequiredService<TDbContext>();
var transaction = new SqlSugarTransactionApi(
dbContext
);
unitOfWork.AddTransactionApi(transactionApiKey, transaction);
//await Console.Out.WriteLineAsync("开始新的事务");
// Console.WriteLine(dbContext.SqlSugarClient.ContextID);
await dbContext.SqlSugarClient.Ado.BeginTranAsync();
return dbContext;
//await Console.Out.WriteLineAsync("开始新的事务");
// Console.WriteLine(dbContext.SqlSugarClient.ContextID);
await dbContext.SqlSugarClient.Ado.BeginTranAsync();
return dbContext;
//}
//else
//{
@@ -134,5 +173,6 @@ namespace Yi.Framework.SqlSugarCore.Uow
return await ConnectionStringResolver.ResolveAsync(connectionStringName);
}
}
}