Polly如何在c#项目中使用
今天就跟大家聊聊有关Polly如何在c#项目中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
Polly是一个C#实现的弹性瞬时错误处理库它可以帮助我们做一些容错模式处理,比如:
超时与重试(Timeout and Retry)
熔断器(Circuit Breaker)
舱壁隔离(Bulkhead Isolation)
回退(Fallback)
使用也是非常简单的,比如:
//Retrymultipletimes,callinganactiononeachretry //withthecurrentexceptionandretrycount Policy .Handle<SomeExceptionType>() .Retry(3,onRetry:(exception,retryCount)=> { //Addlogictobeexecutedbeforeeachretry,suchaslogging });
但是每个地方我们都得这样写,个人还是不喜,那么怎么简化呢?当然是使用 Norns.Urd 这些AOP框架封装我们常用的东西做成 Attribute 啦
如何实现简化呢?
我们来尝试将 Retry功能 做成 RetryAttribute吧
1.安装 AOP 框架
自己写多累呀,用现成的多好呀
dotnetaddpackageNorns.Urd
2.编写 Retry InterceptorAttribute
publicclassRetryAttribute:AbstractInterceptorAttribute { privatereadonlyintretryCount; publicRetryAttribute(intretryCount) { this.retryCount=retryCount; } publicoverrideasyncTaskInvokeAsync(AspectContextcontext,AsyncAspectDelegatenext) { awaitPolicy.Handle<Exception>() .RetryAsync(retryCount) .ExecuteAsync(()=>next(context)); } }
3.考虑到 async 和 sync 在Polly 有差异,那么我们兼容一下吧
publicclassRetryAttribute:AbstractInterceptorAttribute { privatereadonlyintretryCount; publicRetryAttribute(intretryCount) { this.retryCount=retryCount; } publicoverridevoidInvoke(AspectContextcontext,AspectDelegatenext) { Policy.Handle<Exception>() .Retry(retryCount) .Execute(()=>next(context)); } publicoverrideasyncTaskInvokeAsync(AspectContextcontext,AsyncAspectDelegatenext) { awaitPolicy.Handle<Exception>() .RetryAsync(retryCount) .ExecuteAsync(()=>next(context)); } }
4.我们来做个测试吧
publicclassRetryTest { publicclassDoRetryTest { publicintCount{get;set;} [Retry(2)]//使用Retry publicvirtualvoidDo() { if(Count<50) { Count++;//每调用一次就加1 thrownewFieldAccessException(); } } } publicDoRetryTestMock() { returnnewServiceCollection() .AddTransient<DoRetryTest>() .ConfigureAop() .BuildServiceProvider() .GetRequiredService<DoRetryTest>(); } [Fact] publicvoidRetryWhenSync() { varsut=Mock(); Assert.Throws<FieldAccessException>(()=>sut.Do()); Assert.Equal(3,sut.Count);//我们期望调用总共3次 } }
是的,就是这样,我们可以在任何地方使用 RetryAttribute
当然,一些常见的方法已经封装在了 Norns.Urd.Extensions.Polly
这里通过Norns.Urd将Polly的各种功能集成为更加方便使用的功能
如何启用 Norns.Urd + Polly, 只需使用EnablePolly()
如:
newServiceCollection() .AddTransient<DoTimeoutTest>() .ConfigureAop(i=>i.EnablePolly())
TimeoutAttribute
[Timeout(seconds:1)]//timeout1seconds,whentimeoutwillthrowTimeoutRejectedException doubleWait(doubleseconds); [Timeout(timeSpan:"00:00:00.100")]//timeout100milliseconds,onlyworkonasyncmethodwhennoCancellationToken asyncTask<double>WaitAsync(doubleseconds,CancellationTokencancellationToken=default); [Timeout(timeSpan:"00:00:01")]//timeout1seconds,butnoworkonasyncmethodwhennoCancellationToken asyncTask<double>NoCancellationTokenWaitAsync(doubleseconds);
RetryAttribute
[Retry(retryCount:2,ExceptionType=typeof(AccessViolationException))]//retry2timeswhenifthrowException voidDo()
CircuitBreakerAttribute
[CircuitBreaker(exceptionsAllowedBeforeBreaking:3,durationOfBreak:"00:00:01")] //or [AdvancedCircuitBreaker(failureThreshold:0.1,samplingDuration:"00:00:01",minimumThroughput:3,durationOfBreak:"00:00:01")] voidDo()
BulkheadAttribute
[Bulkhead(maxParallelization:5,maxQueuingActions:10)] voidDo()
看完上述内容,你们对Polly如何在c#项目中使用有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注恰卡编程网行业资讯频道,感谢大家的支持。
推荐阅读
-
在Python中,将K添加到列元组列表中的最小元素
处理数据集涉及识别特定列中的最小值并通过添加常量值(K)来更新它。通过实施优化的解决方案,我们可以有效地执行此操作,这对于数据...
-
使用switch case语句编写的C程序,用于计算几何图形的面积
#includevoidmain(){intfig_code;floatside,base,length,...
-
如何使 C# 代码可重用?
要在C#中使代码可重用,请使用接口。接口定义属性、方法和事件,这些成员是接口的成员。接口只包含成员的声明。派生类负责定义成员。这通...
-
C# 中的覆盖和隐藏有什么区别?
方法隐藏在C#中也称为隐藏。父类的方法可供子类使用,无需在遮蔽中使用override关键字。子类有其自己版本的相同函数。在...
-
在Java中使用示例双倍longValue()函数
Java是一种强大的面向对象语言,可以对各种数据类型进行高度的控制和精确度。其中一种功能是doublelongValue(),...
-
如何在Java中定义JSON字段名称的命名约定?
TheFieldNamingPolicycanbeusedtodefineafewstandardnaming...
-
Servlet中的HttpSession接口
在JavaWeb开发领域,了解HttpSession接口是创建动态和响应式Web应用程序的关键。在本文中,我们将探讨...
-
使用while循环查找自然数之和的Java程序
自然数之和可以使用编程语言中的不同迭代语句来计算。迭代语句是执行一组特定代码行直到循环语句中的条件失败的语句。在本文中,我们将讨论...
-
我们可以将Java数组转换为列表吗?
我们可以使用Arrays.asList()方法轻松地将Java数组转换为List。语法publicstaticLi...
-
Java中如何在不使用任何外部库的情况下读取网页内容?
TheURLclassofthejava.netpackagerepresentsaUniformResour...