#c# #asp.net-core #retrypolicy
Вопрос:
Я использую это расширение dapper, которое использует polly для повторной попытки.
Мы видим, что он определяет статическую политику повторных попыток:
private static readonly AsyncRetryPolicy RetryPolicy =
Policy
.Handle<SqlException>(SqlServerTransientExceptionDetector.ShouldRetryOn)
.Or<TimeoutException>()
.OrInner<Win32Exception>(SqlServerTransientExceptionDetector.ShouldRetryOn)
.WaitAndRetryAsync(RetryTimes,
(exception, timeSpan, retryCount, context) =>
{
LogTo.Warning(
exception,
"WARNING: Error talking to ReportingDb, will retry after {RetryTimeSpan}. Retry attempt {RetryCount}",
timeSpan,
retryCount
);
});
В идеале я хочу сделать RetryTimes
настройку. Однако я не уверен, как я могу перейти IConfiguration
к RetryTimes
статическому свойству?
Рабочий раунд, о котором я могу подумать, состоит в том, чтобы определить политику polly как одноэлементную (чтобы я мог прочитать настройки). Затем в этом методе расширения я фактически передаю политику. Это правильный способ использовать его в .NET Core?
Комментарии:
1. установите статическую политику во время запуска после того, как вы уже получили доступ к конфигурации.
2. Как вы используете политику в своем коде? Если вы используете
RetryPolicy
класс, разрешенный из DI, вы также можете разрешить политику повторных попыток как одноэлементную из DI.
Ответ №1:
Я думаю, что было бы неплохо создать место для хранения настроек и назначить его перед использованием.
// Create the holder class
public static class SettingHolder
{
public static int RetryTimes = 0;
}
// Assign to it before you going to use it, in startup file would be nice.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
SettingHolder.RetryTimes = int.Parse(Configuration.GetSection("YourSection")["GoToYourSetting"]);
}