策略建立后是否可以修改?

时间:2018-06-29 21:14:01

标签: polly

我正在创建一个以Policy为参数的API方法调用。 但是,在我的方法中,我想通过添加我自己的重试操作来“添加”此策略,以便我可以执行自己的中间记录和遥测。在概念上与将Click事件添加到Windows UI控件类似。

创建策略后,是否可以修改策略? 还是有一种挂钩机制,也许可以在Execute方法中定义自己的回调?

谢谢

-约翰

1 个答案:

答案 0 :(得分:0)

Polly Policy是不可变的;配置后无法修改。但是,可以通过多种方式将额外行为附加到策略。

根据您要实现的目标,可能有几种方法。

注意:此答案中的所有示例均涉及同步执行委托时使用的同步策略/策略挂钩,但是异步形式的策略存在所有相同的行为。

选项1:所有策略类型都提供委托钩,例如onRetryonBreak; onCacheHit,以及类似的内容。可以在其中添加额外的行为(例如日志记录)。这些挂钩的委托必须在策略配置时定义。 Polly readmePolly-Samples project中有许多示例。 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();
    }
}