NETCore 2.2 Измените SqlConnection, используя переменную среды

#sql #controller #connection-string #asp.net-core-webapi

#sql #контроллер #строка подключения #asp.net-core-webapi

Вопрос:

Нужна помощь в динамическом изменении строки подключения, предоставленной в API для netcore 2.2.

Это мой пример кода

Публичный запуск

_connectionString = криптография.GetProtectedValue(«В», dbEnvironmentVariableName);

Общедоступные конфигурационные сервисы

Услуги.Добавьте dbcontextpool(s => s.UseSqlServer(_connectionString));

Пользователь может изменять переменную среды в любое время, и мне нужно, чтобы API динамически отслеживал это изменение при каждом его изменении.

Я нигде не могу найти, чтобы увидеть, что это происходит, за исключением настройки чего-либо в контроллере, но это просто кажется неправильным.

Есть мысли.

Ответ №1:

Ну, во-первых, вам нужно прекратить использовать пул соединений. Это позволяет нескольким экземплярам вашего контекста использовать одно и то же соединение, чего вы не хотите, если это соединение нужно менять на лету.

Затем вам нужно получить строку подключения внутри DbContext регистрации, чтобы каждый раз, когда создается экземпляр, он получал строку подключения заново. В том виде, в каком она у вас есть сейчас, она глобальная.

 services.AddDbContext<MyContext>((provider, options) =>
{
    // get connection string
    options.UseSqlServer(connectionString);
});
  

Я не уверен, как написать этот код для вас, поскольку не ясно, что происходит с cryptography.GetProtectedValue("RandomName", dbEnvironmentVariableName) . В общем, здесь provider будет экземпляр IServiceProvider , и вы хотите использовать его для получения различных служб, необходимых для выполнения этого вызова.

Комментарии:

1. Криптография просто возвращает незашифрованную строку подключения. Хорошо для пула соединений, это имеет смысл. С другой стороны, я не думаю, что это все еще приводит к изменению соединения, пока API запущен. Когда создается новый экземпляр, я согласен, но когда API уже запущен, он не сбросит строку подключения с помощью этого метода. Надеюсь, это имеет смысл.

2. Контекст ограничен областью запроса, поэтому каждый запрос получит свой собственный экземпляр с текущей строкой подключения на тот момент. Вы правы в том, что после создания экземпляра значение строки подключения блокируется, и это имеет место независимо. Перезагрузка конфигурации происходит только для каждого запроса, так что на практике это не проблема. Однако, если вы намерены изменить строку подключения в середине запроса, то вам на самом деле не повезло.

3. Спасибо, это то, что я прикидывал, просто хотел убедиться.