中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

LindDotNetCore~Aspect面(mian)(mian)向方面(mian)(mian)編程

回到目錄

Aspect面向方面編程

面向側面的程序設計(aspect-oriented programming,AOP,又譯作面向方面的程序設計、觀點導向編程、剖面導向程序設計)是計算機科學中的一個術語,指一種程序設計范型。該范型以一種稱為側面(aspect,又譯作方面)的語言構造為基礎,側面是一種新的模塊化機制,用來描述分散在對象、類或函數中的橫切關注點(crosscutting concern)。
側(ce)面(mian)(mian)的(de)概(gai)(gai)念源于(yu)對面(mian)(mian)向對象的(de)程(cheng)(cheng)序設計的(de)改進,但并不只限(xian)于(yu)此,它還(huan)(huan)可以用來(lai)改進傳統的(de)函數。與側(ce)面(mian)(mian)相(xiang)關的(de)編程(cheng)(cheng)概(gai)(gai)念還(huan)(huan)包(bao)括(kuo)元對象協議、主題(subject)、混(hun)入(mixin)和(he)委托。

  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):在支配性分解的基礎上,提供的一種輔助的模塊化機制,這種新的模塊化機制可以捕捉橫切關注點。

攔截器

在方法(fa)(fa)執(zhi)行(xing)前或者執(zhi)行(xing)后注(zhu)入新(xin)的代(dai)碼(ma)段(duan),讓新(xin)的代(dai)碼(ma)段(duan)的功能注(zhu)入到原方法(fa)(fa)里,其(qi)中(zhong)原方法(fa)(fa)需要(yao)是(shi)(shi)接口(kou)方法(fa)(fa)或者虛方法(fa)(fa),原因是(shi)(shi)我們要(yao)重寫原方法(fa)(fa)!

日志攔截器

這種攔截器(qi)比較簡單,只在(zai)方法執行(xing)前,后進行(xing)日志行(xing)為的注入,不需要返回結果(guo).

緩存攔截器

這種攔(lan)截器比起日志攔(lan)截器來說就復雜一些,它需要通過緩(huan)(huan)存的key來返回(hui)結果,同時集成了(le)緩(huan)(huan)存的邏輯及緩(huan)(huan)存持久(jiu)化組(zu)件等.

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

回到目錄

posted @ 2018-02-06 15:41  張占嶺  閱讀(955)  評論(0)    收藏  舉報