"回到目錄" Aspect面向方面編程 面向側面的程式設計(aspect oriented programming,AOP,又譯作面向方面的程式設計、觀點導向編程、剖面導向程式設計)是電腦科學中的一個術語,指一種程式設計範型。該範型以一種稱為側面(aspect,又譯作方面)的語言構造為基礎,側面是 ...
Aspect面向方面編程
面向側面的程式設計(aspect-oriented programming,AOP,又譯作面向方面的程式設計、觀點導向編程、剖面導向程式設計)是電腦科學中的一個術語,指一種程式設計範型。該範型以一種稱為側面(aspect,又譯作方面)的語言構造為基礎,側面是一種新的模塊化機制,用來描述分散在對象、類或函數中的橫切關註點(crosscutting concern)。
側面的概念源於對面向對象的程式設計的改進,但並不只限於此,它還可以用來改進傳統的函數。與側面相關的編程概念還包括元對象協議、主題(subject)、混入(mixin)和委托。
- 術語
- 攔截器
- 日誌攔截器
- 緩存攔截器
術語
- 關註點(concern):對軟體工程有意義的小的、可管理的、可描述的軟體組成部分,一個關註點通常只同一個特定概念或目標相關聯。
- 主關註點(core concern):一個軟體最主要的關註點。
- 關註點分離(separation of concerns,SOC):標識、封裝和操縱只與特定概念、目標相關聯的軟體組成部分的能力,即標識、封裝和操縱關註點的能力。
- 方法(method):用來描述、設計、實現一個給定關註點的軟體構造單位。
- 橫切(crosscut):兩個關註點相互橫切,如果實現它們的方法存在交集。
- 支配性分解(dominant decomposition):將軟體分解成模塊的主要方式。傳統的程式設計語言是以一種線性的文本來描述軟體的,只採用一種方式(比如:類)將軟體分解成模塊;這導致某些關註點比較好的被捕捉,容易進一步組合、擴展;但還有一些關註點沒有被捕捉,彌散在整個軟體內部。支配性分解一般是按主關註點進行模塊分解的。
- 橫切關註點(crosscutting concerns):在傳統的程式設計語言中,除了主關註點可以被支配性分解方式捕捉以外,還有許多沒有被支配性分解方式捕捉到的關註點,這些關註點的實現會彌散在整個軟體內部,這時這些關註點同主關註點是橫切的。
- 側面(aspect):在支配性分解的基礎上,提供的一種輔助的模塊化機制,這種新的模塊化機制可以捕捉橫切關註點。
攔截器
在方法執行前或者執行後註入新的代碼段,讓新的代碼段的功能註入到原方法里,其中原方法需要是介面方法或者虛方法,原因是我們要重寫原方法!
日誌攔截器
這種攔截器比較簡單,只在方法執行前,後進行日誌行為的註入,不需要返回結果.
緩存攔截器
這種攔截器比起日誌攔截器來說就複雜一些,它需要通過緩存的key來返回結果,同時集成了緩存的邏輯及緩存持久化組件等.
LindAspect緩存的介紹
- 存儲 :數據持久化到redis中間件里
- 結構 :採用redis-hashset進行存儲
- 鍵首碼:Lind_Caching_
- 鍵組成:首碼+方法名
- hashkey:方法參數的組合
- hashval:存儲方法返回的結果,以json格式存儲
代碼Demo
/// <summary>
/// 為方法添加緩存行為
/// </summary>
/// <returns></returns>
[CachingAspect]
public virtual List<People> GetHello()
{
return new List<People>
{
new People("test1","ok",DateTime.Now),
new People("test2","sad",DateTime.Now),
new People("test2","force",DateTime.Now),
};
}
[Fact]
public void FuncInvoke()
{
var fun = ProxyFactory.CreateProxy<AspectTest, AspectTest>();
var obj1 = fun.GetHello();
Thread.Sleep(1000);
var obj2 = fun.GetHello();
Assert.Equal(obj1, obj2);
}