0

在我的代码中,有几个策略需要相同。例如:

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));

或者类似的东西。我可能在图书馆里忽略了一些东西,在这种情况下,我道歉!

4

1 回答 1

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);
    }
}
于 2017-03-21T22:26:33.940 回答