Полли Policy
неизменна; его нельзя изменить после настройки. Однако есть несколько способов добавить дополнительное поведение к политике.
Может быть несколько подходов в зависимости от того, чего вы хотите достичь.
Примечание: Все примеры в этом ответе относятся к синхронным политикам / перехватчикам политик, используемым при синхронном выполнении делегатов, но все же существует поведение для асинхронных форм политик.
Вариант 1: Все типы политик предлагают перехватчики делегатов, такие как onRetry
; onBreak
; onCacheHit
и тому подобное. В них можно добавить дополнительное поведение (например, ведение журнала). Делегаты, прикрепленные к этим хукам, должны быть определены во время настройки политики. В проектах Polly и Polly-Samples имеется множество примеров. Polly wiki подробно охватывает все такие хуки делегатов.
Вариант 2: Если тот факт, что эти делегаты (onRetry
и т. Д.) Должны быть определены во время настройки политики, является ограничением: вы можете преодолеть это с помощью Polly.Context
. Большинство делегатов, таких как onRetry
, существуют в форме, которая принимает Context
в качестве входного параметра. То, что Context
ограничено выполнением, может переносить произвольные данные, и экземпляр Context
может быть передан в вызов .Execute(...)
.
Таким образом, вы можете определить Context["ExtraAction"] = /* some Action */
и передать его в .Execute(...)
. Затем делегат onRetry
может извлечь Action extraAction = Context["ExtraAction"]
(с некоторыми защитными проверками) и выполнить его extraAction()
. Это позволяет вводить произвольное поведение делегату onRetry
после настройки политики.
Вариант 3: Выполнить дополнительную логику в делегате Выполнено . Конечно, вы могли бы написать свой собственный Execute(...)
метод-обертку, который принимает делегат для выполнения, и политику, но обертки в дополнительном поведении.
public TResult MyExecute(ISyncPolicy policy, Func<TResult> toExecute)
{
return policy.Execute(() =>
{
/* do my extra stuff */
return toExecute();
}
}