AOP面向切面程式設計的應用
前兩年看書的時候,瞭解到了面向切面程式設計方法(AOP)。對這個技術印象最深刻的特點就是可以實現業務邏輯和許可權、異常處理等的分離。正好在做專案的時候,有些場景可以借鑑這個思想,於是在專案中借用開源的.net環境的KingAOP實現了選單按鈕許可權控制、上下游節點的狀態控制,效果還不錯。
AOP介紹
網上查了一些資料,AOP已經發展很長時間,應該是個比較成熟的技術,在java Spring框架中貌似應用很普遍。
具體可以實現的功能如下:(參考百度百科)
- Authentication 許可權
- Caching快取
- Context passing內容傳遞
- Error handling 錯誤處理
- Lazy loading 延時載入
- Debugging 除錯
- logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
- Performance optimization效能優化
- Persistence 持久化
- Resource pooling資源池
- Synchronization 同步
- Transactions事務
.net AOP工具
網上查了很多資料,發現.net平臺下框架不多,而且收費,比如PostSharp,Spring .net。一開始找了PostSharp試用,發現框架太重,還不容易上手。又搜尋了其他一些框架,找了一款開源的.net
AOP實現
專案介紹
本專案是一個CAE二次開發專案,目的是基於ANSYS搭建用於核電分析法設計計算的平臺。該專案之前,還有一個相同需求的專案,也是我主導實施的。當時,我們完全在ANSYS內部做二次開發實現的。這種開發方法使用TCl/Tk和C#混合的方法實現,效率很慢,而且不穩定。
基於本專案,我們想搭建一個框架,將經典ANSYS嵌入到框架中,希望以後所有的ANSYS二次開發專案都能使用這個框架來實現,節省成本,提高效率。
借用AOP實現的功能
- 專案中涉及到不同人員許可權的設定,即不同人員可以使用的選單按鈕是不一樣的。
- 前處理、求解、後處理中的各個功能的邏輯關係想通過節點狀態的變化反應出來,通過節點狀態來控制功能之間的資料邏輯流轉。
實現過程
1.測試KingAOP
KingAOP下載後,使用幾個例子做測試,發現原始碼可能有些問題,於是修改了,重新編譯得到dll檔案。(具體修改的哪裡,有點忘了)
2. 編寫許可權驗證程式碼
以該專案為例,我們實現了使用授權檔案進行許可權驗證的功能:
- 編寫了一個LicenseManager類,用來管理許可權相關內容
- 編寫了一個static bool LicenseValid(string licName)函式,用來驗證許可權;
3. 套上AOP外套
繼承KingAOP的 MethodInterceptionAspect,實現基於許可權管理的控制:
public class licenseManageAspect : MethodInterceptionAspect
{
public override void OnInvoke(MethodInterceptionArgs args)
{
if (LicenseManager.LicenseValid("./Licensing/license.lic"))
{
...
args.Proceed();
}
else
{
args.ReturnValue = false;
...
}
}
}
4. 封裝業務程式碼
將業務程式碼重新組裝到實現了AOP介面IDynamicMetaObhectProvider類中
internal class licenseIntercept : IDynamicMetaObjectProvider //繼承介面
{
...
public DynamicMetaObject GetMetaObject(Expression parameter)
{
return new AspectWeaver(parameter, this);
}
[licenseManageAspect] //在業務程式碼方法上附加AOP屬性
public void popUpSolver()
{
}
[licenseManageAspect]
public void createNewTask()
{
new taskMenus.newTaskForm().ShowDialog();
}
...
}
5.呼叫業務程式碼
在高一層業務程式碼中建立封裝AOP業務程式碼的類的物件,呼叫即可。
public class menuCallbacks
{
...
dynamic licenseControl = new licenseIntercept(); //建立用AOP方法封裝的業務類例項
public void Exit(object o)
{
Application.Exit();
}
public void createNewTask(object ToolStripMenuItem)
{
licenseControl.createNewTask(); // 呼叫AOP業務類
}
...
總結
使用AOP,將業務邏輯和許可權驗證程式碼分離,互相獨立,可以統一修改許可權驗證邏輯,單獨去修改每一功能的邏輯實現。