Closed xjhmiigu closed 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 实现根据配置来实现切换数据库和读写分离
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; }), }; }); 这样行不通,能力有限,不知道该怎么处理
public interface IReadDbContext: IDbContext
{
}
public class ReadDbContext : IReadDbContext
{
IDbContext _dbContext;
public ReadDbContext(IDbContext dbContext) //根据配置传入 MsSqlContext,MySqlContext。。。。
{
this._dbContext = dbContext;
}
//。。。各种实现,调用 _dbContext 的方法
}
谢谢大佬!!看到这段代码我就明白了,之前可能自己太执着于直接使用您框架的IDbContext 去实现了,忽略了我可以进行二次封装!非常感谢
汗颜,走到死胡同里了
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,万分感谢!!