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

RoL*_*LLs 8 c# asp.net-mvc connection-string asp.net-web-api

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

你怎么能更改2个连接字符串在运行时的 Global.asax下Application_Start()

Web.config文件

<connectionStrings>
  <add connectionString="DB1" value=""/>
  <add connectionString="DB2" value=""/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

Global.asax中

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

细节

在我开始询问为什么我这样做或我不应该这样做的原因之前,请参考以下文章Azure Key Vault连接字符串和N层设计.

基本上,我正在尝试使用带有N层应用程序的Key Vault.WebAPI通过以下方式定义连接字符串Web.config.为了避免硬编码连接字符串,它们将存储在Key Vault中.但是,由于使用的Unit Of Work模式,我不确定最佳路由,我目前正在尝试找出在运行时为Web API项目注入或更改连接字符串的潜在解决方案.

Hoo*_*ini 4

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

看看这个答案,我认为您可以实现一个函数,该函数将根据变量返回所需的连接字符串:

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

现在,假设您有上述函数,您可以使用它来初始化您的DbContext:

MyDbContext myDbContext = new MyDbContext(GetConnectionString());
Run Code Online (Sandbox Code Playgroud)

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

kernel.Bind<IMyDbContext>()
    .ToConstructor(ctorArg => new MyDbContext(GetConnectionString()))
    .InRequestScope();
Run Code Online (Sandbox Code Playgroud)