围绕 Polly Framework 进行包装,以便实现可以留在一个地方

Wrapper around Polly Framework so that implementation can stay at a single place

我浏览了 Polly Framework 的文档和示例,它真的很棒而且简单易用!!

在我的例子中,我想class将所有异常分为 3 种类型:临时的、永久的和日志的。现在,我想要一段代码来负责处理本质上是暂时的错误,方法是使用 Polly Framework 进行等待和重试。

  WaitAndRetryAsync(new[]{
                    TimeSpan.FromSeconds(1),
                    TimeSpan.FromSeconds(2),
                    TimeSpan.FromSeconds(5)
                  })

同样,如果某些东西本质上是永久性的(应该能够根据我们尝试处理的异常知道它的类型示例:超时可以是临时的,但如果数据库信用不正确,那么它就是永久性的)那么我们可以向支持人员发送电子邮件。

现在,问题从这里开始,我如何使用接口或抽象 class 包装它,以便我的所有派生 class 可以传递异常以及方法名称,这可以传递到我的新框架,它将完成需要的工作。

任何指点都会有很大帮助!

您可以创建一个 class 接受 FuncAction 到您希望 Polly 调用的代码。

像这样的辅助方法:

public class RetryWrapper
    {
        public static TOutput Execute<TInput, TOutput>(Func<TInput, TOutput> func, TInput input)
        {
            RetryPolicy retryPolicy = Policy.Handle<TimeoutException>()
                .Or<OtherException>()
                .WaitAndRetry(3, x => new TimeSpan(0, 0, 2));

            return retryPolicy.Execute(() => func(input));
        }
    }

然后就可以调用了

var result = RetryWrapper.Execute<string, bool>(x => MethodToCall(x), "input")