AOP過濾器與攔截器的差異

  • 94
  • 0
  • C#
  • 2024-07-10

AOP Filter與Interceptor

無意間接觸了Interceptor,但想想Interceptor做的事不是跟Filter一樣嗎!!!! 但其實是有差異的,就來記錄一下差異!!

AOP(Aspect-Oriented Programming),中文有很多翻譯(特性、切面、橫面)導向程式設計,是一種新的方法論,它是對傳統OOP程式設計的一種補充。OOP是關注將需求功能劃分為不同且相對獨立,封裝成良好的類別,並讓它們有屬於自己的行為模式,依靠繼承和多型等來定義彼此的關係。AOP是希望能夠將通用需求功能從不相關的類別當中分離出來,能夠使得很多類別共享一個行為,一旦發生變化,不必修改很多類別,而只需要修改這個行為即可。AOP是使用切面(Aspect)將橫面關注點模組化,OOP是使用類將狀態和行為模組化。

Filter和Interceptor皆屬於AOP。

Filter過濾器:如Authorization驗證、Action動作、Result結果、Exception例外….等等,主要是對Request到Response中間層層過濾,過濾符合你要求的某些東西,而定義這些Filter。

Interceptor攔截器:當有一個流程正在進行時,你希望對這個流程的某個Service做干預他的執行或額外做甚麼事情,這是攔截器做的事。

Filter就不再贅述,Interceptor可以把共用的地方抽出來,比如日誌記錄、效能統計或者交易(Transaction),針對特定的Service做額外處理。
 

簡單的Interceptor日誌紀錄:

using Castle.DynamicProxy;

namespace InterceptorTest
{
   internal class Program
   {
       static void Main(string[] args)
       {
           ProxyGenerator generator = new ProxyGenerator();
           //決定此類別運用哪個攔截器
           IInterceptor intercept = new AOPLogInterceptor();
        
           var myClass = generator.CreateClassProxy<MyClass>(intercept);
           myClass.Add();
           Console.ReadLine();
       }
   }
   public class MyClass
   {
       public virtual void Add()
       {
           Console.WriteLine("呼叫MyClass,Add方法");
       }
   }
   public class AOPLogInterceptor : IInterceptor
   {
       public void Intercept(IInvocation invocation)
       {
           Console.WriteLine("執行前攔截,紀錄Log");
           invocation.Proceed(); //執行方法
           Console.WriteLine("執行後攔截,紀錄Logs");
       }
   }
}