shuxinqin / Chloe

A lightweight and high-performance Object/Relational Mapping(ORM) library for .NET --C#
https://github.com/shuxinqin/Chloe/wiki
MIT License
1.52k stars 457 forks source link

我想利用连接多库的方式去实现读写分离并且支持根据配置去连接不同的类型的数据库,希望大佬给个思路或者写个Demo #388

Closed xjhmiigu closed 3 months ago

xjhmiigu commented 4 months ago

services.AddScoped( => { var connectionString = configuration.GetConnectionString("YMW.Write"); DbContext context = configuration.GetSection("ServiceConfig")["ServiceDataBaseType"] switch { "sqlserver" => new MsSqlContext(connectionString), "postgresql" => new PostgreSQLContext(() => { IDbConnection conn = new NpgsqlConnection(connectionString); return conn; }), "dm" => new DamengContext(() => { IDbConnection conn = new DmConnection(connectionString); return conn; }), => new MySqlContext(() => { IDbConnection conn = new MySqlConnection(connectionString); return conn; }), }; return context; });目前我根据配置去连接不同的库已经实现,但是我只能注入IDbContext,不知道该怎么实现 自定义的上下文支持根据配置去连接不同的类型的数据库,希望大佬给个思路或者写个Demo,万分感谢!!

shuxinqin commented 4 months ago

https://github.com/shuxinqin/Chloe/wiki/MultipleDatabase 你看看这个行不行

xjhmiigu commented 3 months ago

public interface IDbContextA : IDbContext {

} public interface IDbContextB : IDbContext {

}

public class DbContextA : MsSqlContext, IDbContextA { public DbContextA(string connString) : base(connString) {

}

} public class DbContextB : MsSqlContext, IDbContextB { public DbContextB(string connString) : base(connString) {

}

} 这个方式只能实现指定类型多库从而用以实现读写分离,在切换数据库类型时需要重新定义以上对象, 比如我之前使用的时SQLserver 使用的时时候继承的是MsSqlContext ,切换到 mysql 时需要定义两个新的DbContext 去继承 MySqlContext.我在想是否有办法做到我定义IDbContextA ,IDbContextB 实现根据配置来实现切换数据库和读写分离

xjhmiigu commented 3 months ago

public interface IDbContextQuery : IDbContext; public interface IDbContextWrite : IDbContext; public class QueryDbContext : DbContext, IDbContextQuery; public class WriteDbContext : DbContext, IDbContextWrite;

services.AddScoped<IDbContextQuery, QueryDbContext>(o => { var connectionString = configuration.GetConnectionString("YMW.Write"); var dbType = configuration.GetSection("ServiceConfig")["ServiceDataBaseType"]; return dbType switch { "sqlserver" => new MsSqlContext(connectionString), "postgresql" => new PostgreSQLContext(() => { IDbConnection conn = new NpgsqlConnection(connectionString); return conn; }), "dm" => new DamengContext(() => { IDbConnection conn = new DmConnection(connectionString); return conn; }), _ => new MySqlContext(() => { IDbConnection conn = new MySqlConnection(connectionString); return conn; }), }; }); 这样行不通,能力有限,不知道该怎么处理

shuxinqin commented 3 months ago
public interface IReadDbContext: IDbContext
{

}

public class ReadDbContext :  IReadDbContext
{
    IDbContext _dbContext;
     public ReadDbContext(IDbContext dbContext)   //根据配置传入 MsSqlContext,MySqlContext。。。。
     {
          this._dbContext = dbContext;
     }

 //。。。各种实现,调用 _dbContext 的方法
}
xjhmiigu commented 3 months ago

谢谢大佬!!看到这段代码我就明白了,之前可能自己太执着于直接使用您框架的IDbContext 去实现了,忽略了我可以进行二次封装!非常感谢

xjhmiigu commented 3 months ago

汗颜,走到死胡同里了