Могу ли я объединить политики устойчивости Retry и Fallback Polly? - PullRequest
2 голосов
/ 22 марта 2019

Я хотел бы выполнить определенную операцию, и если она не удалась три раза, вернуть ноль. Примерно так в Полли было бы прекрасно:

var results = await Policy<IList<Value>>
    .Handle<TaskCanceledException>()
    .RetryAsync<IList<Value>>(3)
    .FallbackAsync(null as IList<Value>)
    .ExecuteAsync(() => myRestfulCall());

Это невозможно, поскольку RetryAsync возвращает AsyncRetryPolicy, и для этого типа не определен метод расширения Fallback. Есть ли для этого синтаксис Полли, который не требует блока try / catch?

1 Ответ

3 голосов
/ 22 марта 2019

Polly позволяет гибко комбинировать любые политики с помощью PolicyWrap: обширной документации здесь .

Пример, который вы цитируете, может быть реализован примерно так:

var fallback = Policy<IList<Value>>
    .Handle<TaskCanceledException>()
    .FallbackAsync(null as IList<Value>);

var retry = Policy<IList<Value>>
    .Handle<TaskCanceledException>()
    .RetryAsync<IList<Value>>(3);

var results = await fallback.WrapAsync(retry)
    .ExecuteAsync(() => myRestfulCall());
...