JointCode.Aspects,一個基於裝飾模式的 Aop 框架

實現 Aop 的方法有不少,有人給總結了一下,至少有如下幾種:網絡

Approach框架

方法ide

Advantages性能

優勢flex

Disadvantagesui

缺點spa

Remoting Proxies設計

遠程代理代理

Easy to implement, because of the .Net framework supportcode

容易實現,由於有.NET框架的支持。

Somewhat heavyweight
Can only be used on interfaces or MarshalByRefObjects

微顯重量級

僅在接口或MarshalByRefObjects 上使用

Derivingfrom ContextBoundObject

從ContextBoundObject 派生

Easiest to implement
Native support for call interception

很容易實現

原生支持調用攔截

Very costly in terms of performance

很是昂貴的性能代價

Compile-time subclassing
( Rhino Proxy )

編譯時子類化

Easiest to understand

很容易理解

Interfaces or virtual methods only

僅用於接口或虛方法

Runtime subclassing
( Castle Dynamic Proxy )

運行時子類化

Easiest to understand
Very flexible

很容易理解

很是靈活

Complex implementation (but alreadyexists)
Interfaces or virtual methods only

複雜的實現(已經實現)

僅用於接口或虛方法

Hooking into the profiler API
( Type Mock )

分析 API鉤子

Extremely powerful

極端強大

Performance?
Complex implementation (COM API, require separate runner, etc)

性能未知

複雜實現(COM API,須要單獨運行等)

Compile time IL-weaving
( Post Sharp / Cecil )

編譯時 IL織入

Very powerful
Good performance

很是強大

良好的性能

Very hard to implement

實現很是困難

Runtime IL-weaving
( Post Sharp / Cecil )

運行時 IL織入

Very powerful
Good performance

很是強大

朗好的性能

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     }
View Code

如上所示,假設咱們有一個要攔截的類 Base,咱們要攔截其虛方法 Print。那麼咱們只要從這個 Base 類派生出一個 Derived 類,而後在 Derived 類中重寫這個方法,並在重寫的方法中調用原來的方法,這樣就實現了簡單的方法攔截。

爲何說是半成品呢?

開發這個框架時,做者的本意是想把這個框架用到本身的 IoC 框架(My.IoC)中,讓 IoC 負責對象建立,而 JointCode.Aspects 則負責方法注入,這樣能夠經過配置實現很是靈活的對象生成。所以 JointCode.Aspects 只是在運行時動態生成被裝飾類的派生類從而實現方法注入,但它並不負責爲咱們建立該派生類的對象,因此我說它是一個半成品。

使用場景設想

好比說,咱們能夠設想一下這樣的場景:咱們須要執行某些須要驗證身份的操做(例如刪除文件、訪問網絡等), 咱們爲這些操做分別設計了一個服務,並將這些服務註冊到 IoC 中。因爲身份驗證這個動做是共同的,咱們能夠將這個動做從業務代碼中抽取出來,寫到一個公共方法中。而後,當咱們在 IoC 中註冊這些服務時,咱們能夠指定將身份驗證動做植入這些操做中,從而在運行時動態改變業務流程。

一點說明

目前來講,這個框架只是我我的本身在用,並未開源。這篇文章也只是簡單介紹一下這個框架,遠遠沒有涉及到這個框架的設計思路,若是您對這個框架感興趣的話,歡迎您在下面的評論區中提出問題共同討論。

使用方法

我爲這個框架寫了一個簡單的示例,您能夠單擊 此處 下載示例源碼。至於這個框架的具體使用方法,且容我在之後有必要時再慢慢寫出吧。

相關文章
相關標籤/搜索