Могу ли я комбинировать политики устойчивости Retry и Fallback Polly?

Я хотел бы выполнить определенную операцию, и если она не удастся трижды вернуть null. Что-то вроде этого в Polly было бы идеально:

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

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


person Aidan    schedule 22.03.2019    source источник


Ответы (1)


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());
person mountain traveller    schedule 22.03.2019
comment
Я думаю, вы пропустили await перед звонком в WrapAsync, но спасибо, это именно то, чего мне не хватало. - person Aidan; 25.03.2019