Как изменить ConnectionStrings во время выполнения для веб-API - PullRequest
0 голосов
/ 23 февраля 2019

Надеюсь, это простой вопрос:

Как изменить 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 и N-Layered Design .

По сути, япытаясь использовать Key Vault с N-Layered приложением.WebAPI определяет строку подключения через Web.config.Чтобы избежать жесткого кодирования строк подключения, они будут храниться в Key Vault.Однако из-за использованного шаблона Unit Of Work я не уверен, что это лучший маршрут, и в настоящее время я пытаюсь выяснить возможное решение инъекции или изменения строки подключениятолько во время выполнения для проекта Web API.

1 Ответ

0 голосов
/ 23 февраля 2019

Я чувствую, что, возможно, я не понял вопроса (поскольку я ничего не знаю о хранилище ключей Azure), но вы на самом деле не получаете строку подключения в Application_Start ...

Глядя на этот ответ , я думаю, вы можете реализовать функцию, которая будет возвращать желаемую строку подключения на основе переменной:

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

Теперь, если у вас есть вышеуказанная функция, вы можете использовать еечтобы инициализировать DbContext:

MyDbContext myDbContext = new MyDbContext(GetConnectionString());

Или, если вы вводите DbContext, вы можете использовать его в своем коде DI (пример кода):

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