Недавно я взаимодействовал с библиотекой обработки временных ошибок Polly на C#. Но только в контексте вызова API (микросервисов в нашей экосистеме).
Совсем недавно я понял, что его можно использовать в интеграции RavenDB с одним из моих проектов F# — об этом в блоге.
Вот моя реализация:
создатьПолитику: int -> AsyncRetryPolicy
executeCustom: CancellationToken -> (CancellationToken -> Task<'exception>) -> AsyncRetryPolicy -> Task<'exception>
Идея, стоящая за этим, состоит в том, чтобы создать такой интерфейс:
Содержимое fun ct -> task {}
примерно представляет собой псевдокод. Но выглядит довольно красиво.
Во-первых, createPolicy
создаст AsyncRetryPolicy
, теперь это можно выполнить.
Сделав последний параметр executeCustom
AsyncRetryPolicy
, можно упростить цепочку функций.
Будем надеяться, что CancellationToken
будет пройден, так что когда вы пройдете через токен httpContext.RequestAborted
и он будет отменен, остальная часть цепочки разорвется.
Заключительные мысли
Мне не терпится начать изучать другие части библиотеки и придумывать для нее интерфейсы.
Я не смотрел ни на какие другие библиотеки F#, которые, возможно, уже сделали это — что в этом интересного?