我对C#中的AOP完全陌生。目前,我有兴趣为使用该技术的方法编写重试。
因此,根据发布后的评论:https://doc.postsharp.net/method-interception 我已经编写了这段代码:
[Serializable]
public class RetryAspect : MethodInterceptionAspect
{
private int _sleep;
private int _retries;
private object _expectedResult;
private object _defaultReturnValue;
public RetryAspect(object expectedResult, int waitBetweenCycles, int numberOfRetries) : this(expectedResult, waitBetweenCycles, numberOfRetries, null) { }
public RetryAspect(object expectedResult, int waitBetweenCycles, int numberOfRetries, object defaultReturnValue)
{
_expectedResult = expectedResult;
_sleep = waitBetweenCycles;
_retries = numberOfRetries;
_defaultReturnValue = defaultReturnValue;
}
public override void OnInvoke(MethodInterceptionArgs args)
{
int waitCount = 0;
while (!args.ReturnValue.Equals(_expectedResult))
{
args.Proceed();
if (waitCount++ < _retries)
{
Thread.Sleep(_sleep);
}
else
{
if (_defaultReturnValue != null)
{
args.ReturnValue = _defaultReturnValue;
}
break;
}
}
}
}
class Program
{
static int cnt = 0;
static void Main(string[] args)
{
Console.WriteLine(Test());
Console.ReadKey();
}
[RetryAspect(true, 1000, 5)]
public static bool Test()
{
Console.WriteLine("Test {0}", cnt);
if (cnt == 4)
{
return true;
}
else
{
cnt++;
return false;
}
}
}
现在,有没有一种方法可以通过使用自由/开源AOP框架来达到相同的结果?到目前为止,我还没有找到使用其他AOP框架的有用示例。
答案 0 :(得分:0)
虽然不是AOP,但我建议您使用Polly:
Polly是一个.NET弹性和瞬态故障处理库,允许开发人员表达诸如Retry等策略。
您只需要使用其流畅的API来定义您的政策:
var policy = Policy
.HandleResult<bool>(false)
//Or using one of WaitAndRetry overloads if you want to sleep between retries
.Retry(5);
并执行它:
policy.Execute(() => Test());