在我的代码中,有几个策略需要相同。例如:
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));
或者类似的东西。我可能在图书馆里忽略了一些东西,在这种情况下,我道歉!