根据配置值确定连接字符串

用户007

我用 .Net Core

我有一个场景,我需要根据部门 ID 将连接字符串切换到两个具有相同架构的不同数据库。

我有一个名为Department1旧记录所在位置的数据库,管理层的决定是Department2通过更新DepartmentToggle我们Config数据库中的逗号分隔切换设置定期移动各个部门的记录基本上,我们的 ETL 团队会将记录移动到新数据库,并在完成后更新此设置。长期计划是将这些数据库记录移至云端。这是做这件事的第一步。

因此,如果切换设置DepartmentToggle具有 value "1,2,3",则表示 Departments 1, 2, 3 记录在Department2. 所以,我必须首先DepartmentToggleConfig数据库中读取配置值,检查 DepartmentId 是否包含在切换中。如果是,DepartmentContext 必须使用Department2connectionString。下面是我的上下文类:

public partial class DepartmentContext : DbContext
{
    // Required for DI container
    public DepartmentContext() { }
    // Required for unit testing
    public DepartmentContext(DbContextOptions options) : base(options) {}

    public virtual DbSet<Faculty> Faculties { get; set; }
    public virtual DbSet<Student> Students { get; set; }
    ......
    //More DbSets

    //connectionString to change based on the DepartmentId
    public static string ConnectionString { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(ConnectionString);
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //modelBuilder.Entity<Faculty>(entity => { });
    }
}

有什么建议么?

西蒙·卡坦斯基

您可以通过以下方式进行。

public class DepartmentContext : DbContext
{
    public DepartmentContext(
        IDepartmentRequestContext deptRequestContext, 
        IConnectionSelector connSelector) 
    : base(connSelector.GetConnectionString(deptRequestContext.SelectedDepartament))
    {
    }
}

使用 Scoped 生命周期注册(或 PerRequest 取决于您的容器)创建 DepartmentRequestContext 类。然后您可以创建一个中间件或请求处理程序,它将根据从 Config Db 加载的 1,2,3 设置 SelectedDepartment 值。由于 SelectedDepartment 驻留在 Scoped 实例中,因此在创建期间,您的 Department 上下文中将提供相同的值。

然后在您的 ConnectionSelector 中,您基本上读取基于 SelectedDepartment 的 IOptions 并检索适当的连接字符串。

整个解决方案基于这样一个事实,即应在部门已知并缓存在中间件中之后创建 DepartmentContext。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章