Я работаю над проектом с открытым исходным кодом, который позволит разработчику интегрировать хранилище ключей Azure для извлечения секретов во время выполнения и автоматического переключения на набор учетных данных резервного копирования, если текущие учетные данные устарели.
В настоящее время он работает для служебной шины Azure, где я могу вращать учетные данные, отлавливать ошибки, повторять тот же запрос с теми же объектами, и затем код продолжает работать.
ЧтоС моей текущей попыткой решения я заметил, что вы можете запускать DbContext.Add(entity)
весь день, но он действительно не завершится ошибкой, пока не будет запущен метод DbContext.Save()
.Когда это произойдет, новый dbContext будет сгенерирован из фабрики контекста, но мне нужно сохранить все изменения, вызванные из, Add, Update, Delete, прежде чем будет вызвано «save Changes».
Вот общие методы, которые я использую, чтобы «повторить» при сбое, эта логика повторения работает, пока нет ничего, что нужно передать следующей DbContext
.
Примечание. Аргументы, передаваемые DbContext
, представляют собой имя пользователя и пароль для создания новой строки подключения.
_keySet управляет учетными данными, которые являются «активными» по сравнению с устаревшими.
private G GenericRetry<G>(Func<G> retryMethod)
{
G result = default(G);
try
{
result = retryMethod();
}
catch (DbUpdateException exp)
{
_keySet.Rotate();
string[] args = new string[] { _keySet.Active.Identifier, _keySet.Active.Token };
_activeContext = _contextFactory.CreateDbContext(args);
result = GenericRetry(retryMethod);
_keySet.Refresh();
}
return result;
}
private G GenericRetry<L,G>(Func<L, G> retryMethod, L parameter)
{
G result = default(G);
try
{
result = retryMethod(parameter);
}
catch(DbUpdateException exp)
{
_keySet.Rotate();
string[] args = new string[] { _keySet.Active.Identifier, _keySet.Active.Token };
_activeContext = _contextFactory.CreateDbContext(args);
result = GenericRetry(retryMethod, parameter);
_keySet.Refresh();
}
return result;
}
Любые рекомендации о том, как заменить недействительный DbContext
на новый и сохранить все ожидающие изменения?