AOP 架構基礎
要求懂的知識:AOP、Filter、反射(Attribute)。
如果直接使用 Polly,那麼就會造成業務代碼中混雜大量的業務無關代碼。我們使用 AOP (如果不了解 AOP,請自行參考網上資料)的方式封裝一個簡單的架構,模仿 Spring cloud 中的 Hystrix。
需要先引入一個支援.Net Core 的 AOP,我們用.Net Core 下的 AOP 架構是AspectCore(國産,動态織入),其他要不就是不支援.Net Core,要不就是不支援對異步方法進行攔截 MVC Filter。
GitHub:https://github.com/dotnetcore/AspectCore-Framework
Install-Package AspectCore.Core -Version 0.5.0
這裡隻介紹和我們相關的用法:
1、編寫攔截器CustomInterceptorAttribute 一般繼承自AbstractInterceptorAttribute
public class CustomInterceptorAttribute:AbstractInterceptorAttribute
{
//每個被攔截的方法中執行
public async override Task Invoke(AspectContext context, AspectDelegate next)
{
try
{
Console.WriteLine("執行之前");
await next(context);//執行被攔截的方法
}
catch (Exception)
{
Console.WriteLine("被攔截的方法出現異常");
throw;
}
finally
{
Console.WriteLine("執行之後");
}
}
}
2、編寫需要被代理攔截的類
在要被攔截的方法上标注CustomInterceptorAttribute 。類需要是public類,方法如果需要攔截就是虛方法,支援異步方法,因為動态代理是動态生成被代理的類的動态子類實作的。
public class Person
{
[CustomInterceptor]
public virtual void Say(string msg)
{
Console.WriteLine("service calling..."+msg);
}
}
3、通過AspectCore建立代理對象
ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
{
Person p = proxyGenerator.CreateClassProxy<Person>();
p.Say("rupeng.com");
}
Console.ReadKey();
注意p指向的對象是AspectCore生成的Person的動态子類的對象,直接new Person是無法被攔截的。
研究AOP細節
攔截器中Invoke方法下的參數AspectContext的屬性的含義:
Implementation 實際動态建立的Person子類的對象。
ImplementationMethod就是Person子類的Say方法
Parameters 方法的參數值。
Proxy==Implementation:目前場景下
ProxyMethod==ImplementationMethod:目前場景下
ReturnValue傳回值
ServiceMethod是Person的Say方法
注:此文章是我看楊中科老師的
.Net Core微服務第二版和 .Net Core微服務第二版課件整理出來的現在的努力隻是為了更好的将來,将來你一定不會後悔你現在的努力。一起加油吧!!!
C#/.NetCore技術交流群:
608188505歡迎加群交流
如果您認為這篇文章還不錯或者有所收獲,您可以點選右下角的【推薦】按鈕精神支援,因為這種支援是我繼續寫作,分享的最大動力!