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");
}
}
}