Хороший способ передать конфигурацию значков в статический класс?

#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"]);
        }