天天看點

(6)學習筆記 ) ASP.NET CORE微服務 Micro-Service ---- AOP架構

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

  歡迎加群交流

如果您認為這篇文章還不錯或者有所收獲,您可以點選右下角的【推薦】按鈕精神支援,因為這種支援是我繼續寫作,分享的最大動力!