0

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

有没有办法在创建策略后修改它?或者,是否有一种挂钩机制,我可以在 Execute 方法中定义自己的回调?

谢谢

-约翰

4

1 回答 1

0

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

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

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

选项 1:所有策略类型都提供委托挂钩,例如onRetry; onBreak; onCacheHit, 和类似的。可以在其中添加额外的行为(例如日志记录)。附加到这些挂钩的委托必须在策略配置时定义。Polly 自述文件和Polly-Samples 项目中有很多示例。Polly wiki深入介绍了所有此类委托挂钩。

选项 2:onRetry如果必须在策略配置时定义这些委托(等)这一事实是一个限制:您可以使用Polly.Context. 大多数委托,例如,以作为输入参数onRetry的形式存在。ContextContext是执行范围的,可以携带任意数据,并且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();
    }
}
于 2018-06-29T22:09:20.280 回答