Как регистрировать повторы из Полли с помощью ILoggerFactory - PullRequest
0 голосов
/ 23 октября 2018

Или: Как войти с помощью статического метода.

С https://github.com/App-vNext/Polly у вас есть примеры, подобные этому, где магически доступен регистратор:

Policy
  .Timeout(30, onTimeout: (context, timespan, task) => 
    {
        logger.Warn($"{context.PolicyKey} at {context.ExecutionKey}: execution timed out after {timespan.TotalSeconds} seconds.");
    });

В моемкод Я использую новый паттерн IHttpClientFactory из dotnet core 2.1 и добавляю его следующим образом в мой метод Startup.cs ConfigureServices:

    services.AddHttpClient<IMySuperHttpClient, MySuperHttpClient>()
        .AddPolicyHandler(MySuperHttpClient.GetRetryPolicy())
        .AddPolicyHandler(MySuperHttpClient.GetCircuitBreakerPolicy());

С GetRetryPolicy, который является статическим и выглядит так:

internal static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .WaitAndRetryAsync(
            retryCount: 4,
            sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
            onRetry: OnRetry);
}

Где метод OnRetry также должен быть статическим:

private static void OnRetry(DelegateResult<HttpResponseMessage> delegateResult, TimeSpan timespan, Context context)
{
    // var logger = ??
    // logger.LogWarning($"API call failed blah blah.");
}

Как вы можете получить доступ к ILoggerFactory здесь, если это возможно?

...