Могу ли я изменить политику после ее создания? - PullRequest
0 голосов
/ 30 июня 2018

Я создаю вызов метода API, который принимает политику в качестве аргумента. Тем не менее, в моем методе я хотел бы «добавить» к этой политике, включив мои собственные повторные действия, чтобы я мог выполнять промежуточную регистрацию и собственную телеметрию. Концептуально аналогично добавлению событий Click в элемент управления пользовательского интерфейса Windows.

Есть ли способ изменить политику после ее создания? Или есть ли механизм перехвата, где я могу определить свои собственные обратные вызовы в методе Execute, возможно?

Спасибо

-John

1 Ответ

0 голосов
/ 30 июня 2018

Полли 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();
    }
}
...