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

时间:2018-05-08 14:11:04

标签: c# entity-framework-core asp.net-core-2.0 asp.net-core-webapi

我使用.Net Core

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

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

因此,如果切换设置Config的值为DepartmentToggle,则表示部门1,2,3记录位于"1,2,3"。因此,我必须首先从Department2数据库中读取DepartmentToggle配置值,检查DepartmentId是否包含在切换中。如果是,则DepartmentContext必须使用Config connectionString。以下是我的上下文类:

Department2

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你可以通过以下方式完成。

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。