围绕 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 接受 Func
或 Action
到您希望 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")
我浏览了 Polly Framework 的文档和示例,它真的很棒而且简单易用!!
在我的例子中,我想class将所有异常分为 3 种类型:临时的、永久的和日志的。现在,我想要一段代码来负责处理本质上是暂时的错误,方法是使用 Polly Framework 进行等待和重试。
WaitAndRetryAsync(new[]{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(5)
})
同样,如果某些东西本质上是永久性的(应该能够根据我们尝试处理的异常知道它的类型示例:超时可以是临时的,但如果数据库信用不正确,那么它就是永久性的)那么我们可以向支持人员发送电子邮件。
现在,问题从这里开始,我如何使用接口或抽象 class 包装它,以便我的所有派生 class 可以传递异常以及方法名称,这可以传递到我的新框架,它将完成需要的工作。
任何指点都会有很大帮助!
您可以创建一个 class 接受 Func
或 Action
到您希望 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")