ABP框架上有改造支持多数据库的Demo,决定尝试一下
需要改造XXXX.EntityFrameworkCore里面的类
1.新增MusterConnectionStringResolver,主要是让其注入多个数据库时候自适应数据库连接
public class MusterConnectionStringResolver : DefaultConnectionStringResolver
{
public MusterConnectionStringResolver(IAbpStartupConfiguration configuration)
: base(configuration)
{
}
public override string GetNameOrConnectionString(ConnectionStringResolveArgs args)
{
var connectStringName = this.GetConnectionStringName(args);
if (connectStringName != null)
{
var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
return configuration.GetConnectionString(connectStringName);
}
return base.GetNameOrConnectionString(args);
}
private string GetConnectionStringName(ConnectionStringResolveArgs args)
{
var type = args["DbContextConcreteType"] as Type;
if (type == typeof(MusterShoppingMallDbContext))
{
return MusterConsts.ConnectionStringShoppingMall;
}
else if (type == typeof(MusterMerchantDbContext))
{
return MusterConsts.ConnectionStringMerchant;
}
return MusterConsts.ConnectionStringBase;//采用默认数据库
}
}
2.对XXXDbContext进行改造,新增多个数据库的DBContext
3.对XXXDbContextConfigurer进行改造,将其改造成泛型
public static class MusterDbContextConfigurer<T> where T : AbpDbContext
{
public static void Configure(DbContextOptionsBuilder<T> builder, string connectionString)
{
//builder.UseSqlServer(connectionString);
builder.UseMySql(connectionString);
}
public static void Configure(DbContextOptionsBuilder<T> builder, DbConnection connection)
{
//builder.UseSqlServer(connection);
builder.UseMySql(connection);
}
}
4.对XXXDbContextFactory进行改造,根据新增的数据库进行新增
5.XXXEntityFrameworkModule这边需要进行修改,需要注入新建的MusterConnectionStringResolver,同时需要把新增的DBContext注入,(非常关键)
/// <summary>
/// 注入多个数据库
/// </summary>
/// <typeparam name="T"></typeparam>
private void AddDbContext<T>() where T : AbpDbContext
{
Configuration.Modules.AbpEfCore().AddDbContext<T>(options =>
{
if (options.ExistingConnection != null)
{
MusterDbContextConfigurer<T>.Configure(options.DbContextOptions, options.ExistingConnection);
}
else
{
MusterDbContextConfigurer<T>.Configure(options.DbContextOptions, options.ConnectionString);
}
});
}
刚刚开始以为到这一步就以为可以同时使用多个数据库,运行时候一直不能讲第2个数据库加载进来,排查了很久之后发现还有一个坑需要填,就是ABP在SeedHelper这个类里面注入数据库,所以需要再这里将新增的DBContext注入进来
到这一步差不多完成了,对appsettings.json配置等不用细说,直接上图
对XXXRepository进行改造,让他知道自己属于哪个数据库的
1.新增基类泛型
public abstract class XXXXRepositoryBase<TDbContext, TEntity, TPrimaryKey> : EfCoreRepositoryBase<TDbContext, TEntity, TPrimaryKey>
where TEntity : class, IEntity<TPrimaryKey>
where TDbContext : AbpDbContext
{
protected MusterRepositoryBase(IDbContextProvider<TDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
}
2.XXXRepository需要改变写法
public class UserInformationRepository : MusterRepositoryBase<MusterDbContext, UserInformation, string>, IUserInformationRepository
{
public UserInformationRepository(IDbContextProvider<MusterDbContext> dbContextProvider) : base(dbContextProvider)
{
}
}
后面就是正常ABP的写法,直接调用即可,项目代码太多就不发上去了,有疑问欢迎拍砖