如何在运行时为Web API更改ConnectionStrings

时间:2019-02-22 21:32:47

标签: c# asp.net-mvc asp.net-web-api connection-string

我希望这是一个简单的问题:

  

如何在运行时更改2个连接字符串   Global.asax下的Application_Start()

Web.config

<connectionStrings>
  <add connectionString="DB1" value=""/>
  <add connectionString="DB2" value=""/>
</connectionStrings>

Global.asax

protected void Application_Start() {
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

详细信息

在我开始怀疑为什么要这样做或为什么不这样做之前,请先参考以下帖子Azure Key Vault Connection Strings and N-Layered Design

本质上,我试图将Key Vault与N层应用程序一起使用。 WebAPI通过Web.config定义连接字符串。为了避免对连接字符串进行硬编码,它们将存储在Key Vault中。但是,由于使用了Unit Of Work模式,我不确定最佳途径,并且我目前正在尝试找出 injecting changeing 仅在运行时用于Web API项目的连接字符串。

1 个答案:

答案 0 :(得分:4)

我觉得也许我没有理解这个问题(因为我对Azure Key Vault一无所知),但是您并没有真正在Application_Start中获得连接字符串...

看看this answer,我认为您可以实现一个函数,该函数将基于变量返回所需的连接字符串:

string GetConnectionString()
{
    if (/* some dynamic variable is set */) {
        return  "DB1";
    }
    else {
        return "DB2";
    }
}

现在,假设您具有上述功能,则可以使用它来初始化DbContext

MyDbContext myDbContext = new MyDbContext(GetConnectionString());

或者,如果要注入DbContext,则可以在DI代码中使用它(ninject示例):

kernel.Bind<IMyDbContext>()
    .ToConstructor(ctorArg => new MyDbContext(GetConnectionString()))
    .InRequestScope();