LindDotNetCore~Aspect面向方面編程

回到目錄html

Aspect面向方面編程

面向側面的程序設計(aspect-oriented programming,AOP,又譯做面向方面的程序設計、觀點導向編程、剖面導向程序設計)是計算機科學中的一個術語,指一種程序設計範型。該範型以一種稱爲側面(aspect,又譯做方面)的語言構造爲基礎,側面是一種新的模塊化機制,用來描述分散在對象、類或函數中的橫切關注點(crosscutting concern)。
側面的概念源於對面向對象的程序設計的改進,但並不僅限於此,它還能夠用來改進傳統的函數。與側面相關的編程概念還包括元對象協議、主題(subject)、混入(mixin)和委託。redis

  1. 術語
  2. 攔截器
  3. 日誌攔截器
  4. 緩存攔截器

術語

  1. 關注點(concern):對軟件工程有意義的小的、可管理的、可描述的軟件組成部分,一個關注點一般只同一個特定概念或目標相關聯。
  2. 主關注點(core concern):一個軟件最主要的關注點。
  3. 關注點分離(separation of concerns,SOC):標識、封裝和操縱只與特定概念、目標相關聯的軟件組成部分的能力,即標識、封裝和操縱關注點的能力。
  4. 方法(method):用來描述、設計、實現一個給定關注點的軟件構造單位。
  5. 橫切(crosscut):兩個關注點相互橫切,若是實現它們的方法存在交集。
  6. 支配性分解(dominant decomposition):將軟件分解成模塊的主要方式。傳統的程序設計語言是以一種線性的文原本描述軟件的,只採用一種方式(好比:類)將軟件分解成模塊;這致使某些關注點比較好的被捕捉,容易進一步組合、擴展;但還有一些關注點沒有被捕捉,彌散在整個軟件內部。支配性分解通常是按主關注點進行模塊分解的。
  7. 橫切關注點(crosscutting concerns):在傳統的程序設計語言中,除了主關注點能夠被支配性分解方式捕捉之外,還有許多沒有被支配性分解方式捕捉到的關注點,這些關注點的實現會彌散在整個軟件內部,這時這些關注點同主關注點是橫切的。
  8. 側面(aspect):在支配性分解的基礎上,提供的一種輔助的模塊化機制,這種新的模塊化機制能夠捕捉橫切關注點。

攔截器

在方法執行前或者執行後注入新的代碼段,讓新的代碼段的功能注入到原方法裏,其中原方法須要是接口方法或者虛方法,緣由是咱們要重寫原方法!編程

日誌攔截器

這種攔截器比較簡單,只在方法執行前,後進行日誌行爲的注入,不須要返回結果.json

緩存攔截器

這種攔截器比起日誌攔截器來講就複雜一些,它須要經過緩存的key來返回結果,同時集成了緩存的邏輯及緩存持久化組件等.c#

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

回到目錄緩存

相關文章
相關標籤/搜索