我正在创建一个以 Policy 作为参数的 API 方法调用。但是,在我的方法中,我想通过包含我自己的重试操作来“添加”此策略,以便我可以执行自己的中间日志记录和遥测。在概念上类似于将 Click 事件添加到 Windows UI 控件。
有没有办法在创建策略后修改它?或者,是否有一种挂钩机制,我可以在 Execute 方法中定义自己的回调?
谢谢
-约翰
我正在创建一个以 Policy 作为参数的 API 方法调用。但是,在我的方法中,我想通过包含我自己的重试操作来“添加”此策略,以便我可以执行自己的中间日志记录和遥测。在概念上类似于将 Click 事件添加到 Windows UI 控件。
有没有办法在创建策略后修改它?或者,是否有一种挂钩机制,我可以在 Execute 方法中定义自己的回调?
谢谢
-约翰
PollyPolicy
是不可变的;配置后无法修改。但是,您可以通过多种方式将额外的行为附加到策略中。
根据您想要实现的目标,可能有几种方法。
注意:此答案中的所有示例均指同步执行委托时使用的同步策略/策略挂钩,但所有相同的行为都存在于异步形式的策略中。
选项 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();
}
}