ABP框架上有改造支持多数据库的Demo,决定尝试一下

需要改造XXXX.EntityFrameworkCore里面的类

NetCore 框架下ABP多数据库切换搭建

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

NetCore 框架下ABP多数据库切换搭建

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进行改造,根据新增的数据库进行新增

NetCore 框架下ABP多数据库切换搭建

5.XXXEntityFrameworkModule这边需要进行修改,需要注入新建的MusterConnectionStringResolver,同时需要把新增的DBContext注入,(非常关键)

NetCore 框架下ABP多数据库切换搭建

         /// <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注入进来

NetCore 框架下ABP多数据库切换搭建

到这一步差不多完成了,对appsettings.json配置等不用细说,直接上图

NetCore 框架下ABP多数据库切换搭建

对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的写法,直接调用即可,项目代码太多就不发上去了,有疑问欢迎拍砖

相关文章: