使用用户反馈撰写Polly政策

时间:2017-01-27 09:11:30

标签: polly

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

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

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

1 个答案:

答案 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);
    }
}