我正在创建一个以Policy为参数的API方法调用。 但是,在我的方法中,我想通过添加我自己的重试操作来“添加”此策略,以便我可以执行自己的中间记录和遥测。在概念上与将Click事件添加到Windows UI控件类似。
创建策略后,是否可以修改策略? 还是有一种挂钩机制,也许可以在Execute方法中定义自己的回调?
谢谢
-约翰
答案 0 :(得分:0)
Polly Policy
是不可变的;配置后无法修改。但是,可以通过多种方式将额外行为附加到策略。
根据您要实现的目标,可能有几种方法。
注意:此答案中的所有示例均涉及同步执行委托时使用的同步策略/策略挂钩,但是异步形式的策略存在所有相同的行为。
选项1:所有策略类型都提供委托钩,例如onRetry
; onBreak
; onCacheHit
,以及类似的内容。可以在其中添加额外的行为(例如日志记录)。这些挂钩的委托必须在策略配置时定义。 Polly readme和Polly-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();
}
}