實現 Aop 的方法有不少,有人給總結了一下,至少有如下幾種:網絡
Approach框架 方法ide |
Advantages性能 優勢flex |
Disadvantagesui 缺點spa |
Remoting Proxies設計 遠程代理代理 |
Easy to implement, because of the .Net framework supportcode 容易實現,由於有.NET框架的支持。 |
Somewhat heavyweight 微顯重量級 僅在接口或MarshalByRefObjects 上使用 |
Derivingfrom ContextBoundObject 從ContextBoundObject 派生 |
Easiest to implement 很容易實現 原生支持調用攔截 |
Very costly in terms of performance 很是昂貴的性能代價 |
Compile-time subclassing 編譯時子類化 |
Easiest to understand 很容易理解 |
Interfaces or virtual methods only 僅用於接口或虛方法 |
Runtime subclassing 運行時子類化 |
Easiest to understand 很容易理解 很是靈活 |
Complex implementation (but alreadyexists) 複雜的實現(已經實現) 僅用於接口或虛方法 |
Hooking into the profiler API 分析 API鉤子 |
Extremely powerful 極端強大 |
Performance? 性能未知 複雜實現(COM API,須要單獨運行等) |
Compile time IL-weaving 編譯時 IL織入 |
Very powerful 很是強大 良好的性能 |
Very hard to implement 實現很是困難 |
Runtime IL-weaving 運行時 IL織入 |
Very powerful 很是強大 朗好的性能 |
Very hard to implement 實現很是困難 |
而 JointCode.Aspects 只是一個基於裝飾模式來實現方法攔截的 Aop 半成品。
什麼是裝飾模式,怎麼實現方法攔截呢?
用代碼來簡單解釋一下。
1 public class Base 2 { 3 public void Print() 4 { 5 DoPrint(); 6 } 7 protected virtual void DoPrint() 8 { 9 Console.WriteLine("Base.DoPrint...." + (City ?? string.Empty)); 10 } 11 } 12 public class Derived : Base 13 { 14 protected sealed override void DoPrint() 15 { 16 Console.WriteLine("Derived.DoPrint"); 17 base.Print(); 18 } 19 }
如上所示,假設咱們有一個要攔截的類 Base,咱們要攔截其虛方法 Print。那麼咱們只要從這個 Base 類派生出一個 Derived 類,而後在 Derived 類中重寫這個方法,並在重寫的方法中調用原來的方法,這樣就實現了簡單的方法攔截。
爲何說是半成品呢?
開發這個框架時,做者的本意是想把這個框架用到本身的 IoC 框架(My.IoC)中,讓 IoC 負責對象建立,而 JointCode.Aspects 則負責方法注入,這樣能夠經過配置實現很是靈活的對象生成。所以 JointCode.Aspects 只是在運行時動態生成被裝飾類的派生類從而實現方法注入,但它並不負責爲咱們建立該派生類的對象,因此我說它是一個半成品。
使用場景設想
好比說,咱們能夠設想一下這樣的場景:咱們須要執行某些須要驗證身份的操做(例如刪除文件、訪問網絡等), 咱們爲這些操做分別設計了一個服務,並將這些服務註冊到 IoC 中。因爲身份驗證這個動做是共同的,咱們能夠將這個動做從業務代碼中抽取出來,寫到一個公共方法中。而後,當咱們在 IoC 中註冊這些服務時,咱們能夠指定將身份驗證動做植入這些操做中,從而在運行時動態改變業務流程。
一點說明
目前來講,這個框架只是我我的本身在用,並未開源。這篇文章也只是簡單介紹一下這個框架,遠遠沒有涉及到這個框架的設計思路,若是您對這個框架感興趣的話,歡迎您在下面的評論區中提出問題共同討論。
使用方法
我爲這個框架寫了一個簡單的示例,您能夠單擊 此處 下載示例源碼。至於這個框架的具體使用方法,且容我在之後有必要時再慢慢寫出吧。