C#中依赖注入装饰器来优化代码架构
同文讲解视频C#中依赖注入装饰器来优化代码架构
场景描述
假设我们需要实现算法A、B,故设计接口IWork
,使得A、B都继承于IWork
接口,如下
这里Console.WriteLine完进行throw是为了模拟方法执行失败的情况
public interface IWork
{
void DoWork();
}
internal class A : IWork
{
public void DoWork()
{
Console.WriteLine("I am doing some work in A.");
throw new NotImplementedException();
}
}
internal class B : IWork
{
public void DoWork()
{
Console.WriteLine("I am doing some work in B.");
throw new NotImplementedException();
}
}
现需要对DoWork
方法进行耗时计算和重试Retry逻辑(当方法执行失败时,间隔一定时间段再执行一次,若失败则重复,不超过3次)。则需要改写DoWork
方法如下
注:RetryPolicy
来自Polly
库,用于实现重试逻辑
internal class A : IWork
{
private readonly RetryPolicy<bool> _retryPolicy;
public A()
{
_retryPolicy = Policy
.HandleResult<bool>(r => !r) //返回true就代表需要执行Retry
.Or<HttpRequestException>()
.WaitAndRetry(
3,
retryAttempt => TimeSpan.FromSeconds(1),
onRetry: (outcome, timespan, retryAttempt, context) =>
{
Console.WriteLine($"{
"".PadLeft(50, '-')}");
Console.WriteLine(