我希望这是一个简单的问题:
如何在
Global.asax
下的Application_Start()
中在运行时更改2个连接字符串
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。
基本上,我正在尝试使用带有N层应用程序的Key Vault。 WebAPI通过Web.config
定义连接字符串。为了避免硬编码连接字符串,它们将存储在Key Vault中。但是,由于使用了Unit Of Work
模式,我不确定最佳路由,我目前正在尝试找出在运行时为Web API项目注入或更改连接字符串的潜在解决方案。
我觉得也许我没有理解这个问题(因为我对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();