AspectNet是一個基於.Net Framework的方面編制器,它同時能實現靜態編織和動態編織,是bobmazelin個人的研究性項目,現仍然處於開發階段,有關AOP概念的介紹請參考:www.aspectJ.org以及IBM的專題.
這是AspectNet功能介紹的第一篇,我主要介紹AspectNet在靜態編織方面的基本結構.
AspectNet在很大程度上參考了aspectJ,它通過MSIL代碼來實現靜態編織,由此AspectNet不需要源代碼,同時它也可以混合編織C#和VB.Net(理論上VC++.Net也可以)產生的動態鏈接庫.
AspectNet由Aspect組成,每個Aspect都可以聲明若干個pointcut,storage以及advice.
1.pointcut的概念和aspectJ基本一致,它捕獲需要被織入的代碼點;
2.storage是ApsectNet特有的概念,它和pointcut類似,捕獲需要織入到pointcut的代碼;
3.advice的概念和aspectJ基本一致,但它不需要寫任何C#或其他代碼,它連接了pointcut和storage,使他們形成了多對多的關系映射.
下面給一個簡單的例子來說明這3個概念:
namespace Bob.Mazelin
{
aspect Demo
{
pointcut AddDemo1():call(public void Mazelin.AspectNet.TestProject.TestClass.Demo1());
before():AddDemo1():PrintBefore();
after():AddDemo1():PrintAfter();
storage PrintBefore():call(public void Mazelin.AspectNet.TestProject.PrintClass.PrintBefore());
storage PrintAfter():call(public void Mazelin.AspectNet.TestProject.PrintClass.PrintAfter());
}
}
其中AddDemo1是pointcut的名字,它捕獲了Demo1方法,該方法沒有返回值,也沒有參數,其被全稱為Mazelin.AspectNet.TestProject.TestClass類聲明.call關鍵字表明了捕獲點為調用該方法的程序點;
PrintBefore和PrintAfter是兩個storage類型,它們分別捕獲了PrintBefore和PrintAfter方法,其解釋意義和pointcut類似;
before和after是advice,它連接了AddDemo1和PrintBefore,PrintAfter,使PrintBefore和PrintAfter分別在AddDemo1調用前和後被調用.
當需要織入的DLL和aspect文件一起運行後,會產生新的織入代碼後的DLL.這樣的織入方式基本不影響代碼的性能,和手工編寫代碼類似,和動態編織的方式相比性能好,但缺乏靈活性.
今天就先到這裡,下次我會介紹AspectNet中call和execution pointcut的使用,還請對AOP由興趣的朋友多提寶貴意見.