1. 程式人生 > >AOP面向切面程式設計的應用

AOP面向切面程式設計的應用

前兩年看書的時候,瞭解到了面向切面程式設計方法(AOP)。對這個技術印象最深刻的特點就是可以實現業務邏輯和許可權、異常處理等的分離。正好在做專案的時候,有些場景可以借鑑這個思想,於是在專案中借用開源的.net環境的KingAOP實現了選單按鈕許可權控制、上下游節點的狀態控制,效果還不錯。

AOP介紹

網上查了一些資料,AOP已經發展很長時間,應該是個比較成熟的技術,在java Spring框架中貌似應用很普遍。

具體可以實現的功能如下:(參考百度百科

  1. Authentication 許可權
  2. Caching快取
  3. Context passing內容傳遞
  4. Error handling 錯誤處理
  5. Lazy loading 延時載入
  6. Debugging 除錯
  7. logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
  8. Performance optimization效能優化
  9. Persistence 持久化
  10. Resource pooling資源池
  11. Synchronization 同步
  12. Transactions事務

.net AOP工具

網上查了很多資料,發現.net平臺下框架不多,而且收費,比如PostSharp,Spring .net。一開始找了PostSharp試用,發現框架太重,還不容易上手。又搜尋了其他一些框架,找了一款開源的.net

AOP框架,叫KingAOP。我覺得框架很輕,原始碼中帶著幾個例子,非常容易上手,滿足專案上的需要,於是決定使用KingAOP實現專案中選單按鈕許可權管理和節點狀態控制功能。

AOP實現

專案介紹

本專案是一個CAE二次開發專案,目的是基於ANSYS搭建用於核電分析法設計計算的平臺。該專案之前,還有一個相同需求的專案,也是我主導實施的。當時,我們完全在ANSYS內部做二次開發實現的。這種開發方法使用TCl/Tk和C#混合的方法實現,效率很慢,而且不穩定。

基於本專案,我們想搭建一個框架,將經典ANSYS嵌入到框架中,希望以後所有的ANSYS二次開發專案都能使用這個框架來實現,節省成本,提高效率。

借用AOP實現的功能

  1. 專案中涉及到不同人員許可權的設定,即不同人員可以使用的選單按鈕是不一樣的。
  2. 前處理、求解、後處理中的各個功能的邏輯關係想通過節點狀態的變化反應出來,通過節點狀態來控制功能之間的資料邏輯流轉。

實現過程

1.測試KingAOP

KingAOP下載後,使用幾個例子做測試,發現原始碼可能有些問題,於是修改了,重新編譯得到dll檔案。(具體修改的哪裡,有點忘了)

2. 編寫許可權驗證程式碼

以該專案為例,我們實現了使用授權檔案進行許可權驗證的功能:

  1. 編寫了一個LicenseManager類,用來管理許可權相關內容
  2. 編寫了一個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,將業務邏輯和許可權驗證程式碼分離,互相獨立,可以統一修改許可權驗證邏輯,單獨去修改每一功能的邏輯實現。