在我的代码中,有几个策略需要相同。例如:
var myIOProblems = Policy
.Handle<IOException>()
.WaitAndRetryForever(i => TimeSpan.FromSeconds(2));
然后我会有一些代码可以完成这项工作:
myIOProblems
.Execute(() => otherPath.CopyTo(otherPathPart.FullName));
这很好用,我可以在我的代码中乱丢后面的语句,在一个中心位置改变行为,这一切似乎都有效。
但在某些地方,我需要向用户/框架提供一些反馈,说明问题正在发生。我可以写一个新政策:
Policy
.Handle<IOException>()
.WaitAndRetryForever(i => TimeSpan.FromSeconds(2), (e, t, c) =>
{
count++;
statusUpdate.PCall($"Copying {otherPath.Name}: {other.Name} -> {Name} (retry ({count}): {e.Message})");
})
.Execute(() => otherPath.CopyTo(otherPathPart.FullName));
但现在我已经失去了重用公共代码的能力。我真正希望能够编写的内容如下:
myIOProblems
.OnRetry(e => statusUpdate.PCall($"Error ({e.Message}), retrying"))
.Execute(() => otherPath.CopyTo(otherPathPart.FullName));
或类似的东西。我可能会忽略图书馆里的某些东西,在这种情况下我道歉!
答案 0 :(得分:0)
您可以将策略包装在工厂类中,并且getter函数可以选择接收onRetry回调:
public class PolicyFactory
{
public static Policy GetMyPolicy(Action<Exception, TimeSpan, Context> onRetry = null)
{
return Policy
.Handle<IOException>()
.WaitAndRetryForever(i => TimeSpan.FromSeconds(2), onRetry);
}
}