摘 要: 在研究了DOTNET平臺Castle框架的基礎上設計出了一個反轉控制(IOC)和面向切面編程(AOP)配置文件自動生成的可視化工具,該工具為程序員快速完成應用系統中IOC和AOP配置文件提供了一個很好的平臺,該工具后來還被作成了插件版本。
關鍵詞: RBAC; IOC; Castle; 配置工具
反轉控制(IOC)和面向切面編程(AOP)技術作為當前比較流行的技術,其優勢已受到廣泛關注,但是這兩項新技術在實際項目上的應用研究卻很落后,而且在.NET平臺下實現這兩項技術沒有形成可以廣泛套用的框架,使得開發人員在.NET平臺下應用IOC和AOP技術的難度和成本大幅度提高。Castle提供了.NET平臺下開發IOC和AOP技術的框架,一定程度上解決了開發人員的難題,但是如何高效地實現IOC和AOP技術的開發,至今無人提出較好的建議。
本文主要研究Castle框架中的IOC和AOP機制,目標是設計出一個可視化工具,實現IOC和AOP機制中配置文件的可視化配置。該工具經過修改和完善也適用于其他框架中的IOC和AOP配置文件的生成。
1 Castle框架和相關技術介紹
1.1 Castle框架介紹
Castle是.NET平臺下的一個系統級框架,它是通過將一些成熟開源應用進行無縫整合而形成的一套完善的系統級應用框架,這其中包括了ActiveRecord、AspectSharp、MonoRail及MicroKernel/Windsor。其中MicroKernel是IOC框架的核心;AspectSharp是AOP的框架。
1.2 IOC技術介紹
反轉控制IOC(Inversion of Control)[1],又稱依賴注入DI(Dependency Injection),是面向對象領域新興的編程思想。簡單地說,IOC就是指由容器來控制程序之間的關系,而非傳統實現中的由程序代碼直接操控。這也就是所謂“反轉控制”的概念所在:控制權由應用代碼轉到外部容器,控制權的轉移,也就是所謂的反轉。
1.3 AOP技術介紹
AOP[2](Aspect Oriented Programming)是OOP的延續,意思是面向切面編程。可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。它可以解決OOP和過程化方法不能夠很好解決的橫切(crosscut)問題,如:事務、安全、日志等橫切關注。當未來系統變得越來越復雜,橫切關注點就成為一個大問題的時候,AOP就可以很輕松地解決橫切關注點的問題。
2 可視化IOC和AOP配置工具設計思路
可視化IOC和AOP配置工具是一個在.NET平臺下開發的WinForm程序,這個工具的主要作用就是在IOC組件或者AOP組件都開發好的條件下,利用這個工具生成IOC或者AOP的配置文件,方法是讀取現存的IOC組件或者AOP組件。在工具中進行相應的配置,最后直接生成開發人員所需的配置文件。
該工具的主要功能是通過讀入現存的IOC組件或AOP組件,提取并暫存組件中與配置有關的重要信息,以可視化的方式顯示在工具界面中,然后由開發人員操作該工具完成組件對應的配置文件的生成。這個過程可以劃分為5個階段(如圖1):讀取類文件>分析類文件>顯示配置信息>開發人員對參數進行配置>生成配置文件。其中前三層是該工具主要實現的功能。因此,該可視化工具的代碼部分分為3個層次來編寫。分別是:讀類文件、分析提取信息、顯示信息。
第一層主要是完成類文件的讀取,在.NET平臺下使用到了System.IO命名空間中文件操作相關的File類和StreamReader類,最終將整個讀取的文件內容以string類型返回,以供第二層分析文件使用。
第二層的功能是在第一層的讀取文件內容的基礎上分析并提取關鍵字,即取出配置文件需要的重要信息,例如IOC反轉控制模式主要有設值注入和構造方法注入,設值注入就是對類中的屬性進行注入,而構造方法注入是對構造函數中的參數值進行注入。因此類中的屬性和構造函數的參數就屬于IOC配置文件的重要信息,第二層主要完成對類似的重要信息的識別和分類。在第二層中,完成的識別功能主要有:
(1) 識別類文件的命名空間、類名、接口名
命名空間、類名、接口名都是組成IOC和AOP配置文件的必備元素。
在IOC配置文件中,命名空間、類名、接口名常出現在component標簽的service和type屬性值中,而在AOP的配置文件中命名空間出現在Imports關鍵字之后。所以對命名空間、類名、接口名的提取是生成配置文件的必要條件。
(2) 識別類文件中的屬性
IOC反轉控制模式中的設值注入就是對類中的屬性進行注入,如采用該注入模式設計系統,在IOC配置文件中,需要把類中的屬性作為配置文件的標簽。
(3) 識別類的構造方法中的參數名
IOC反轉控制模式中的構造注入是對構造函數中的參數值進行注入,如果采用該模式設計系統,在IOC的配置文件中,需要把構造方法的參數名作為配置文件中的標簽。
以上介紹的是第二層所識別的關鍵字的類別。在程序中關鍵字的獲取主要是通過編寫獲取方法來實現。獲取命名空間使用GetNamespace方法;獲取類名使用GetClass方法;獲取接口名使用GetInterface方法;獲取屬性名使用GetProperty方法。實現的思路是在遵循一定規約的前提下通過屬性在類中的位置特征將其提取出來并且依次保存到一個ArrayList對象中。
為了保證該可視化工具識別關鍵字的準確性,程序員在編寫IOC組件時要遵循以下規約:
(1) 要求IOC組件類的修飾符為“Public”
(2) 要求類中的全局變量都聲明為“Private”
(3) 要求屬性的修飾符為“Public”
(4) 要求構造方法的修飾符為“Public”
第三層是頁面層。主要負責頁面可視化設計。頁面層用到了TreeView、Datagrid、TabControl、ContextMenuStrip等控件。TreeView控件以樹形結構展示了當前讀入的組件;Datagrid控件用來展示選中組件的構造方法參數或屬性,并可以設置其參數值或屬性值;ContextMenuStrip控件用于控制添加和刪除組件操作;TabControl控件則是其他控件的容器。
以下,對該層使用到的主要控件及其觸發事件按照其重要程度依次做介紹:
(1) TreeView控件
該控件的內容占第三層代碼的三分之一,主要涉及到的觸發事件有NodeMouseClick(單擊)、NodeMouseDoubleClick(雙擊)、AfterCheck(復選框被選中)。設計的功能主要有:單擊TreeView控件結點可查看該結點所代表組件的命名空間和類名;雙擊組件可以顯示出該組件的構造方法參數或屬性信息;選中復選框后可以將該組件標簽添加到IOC配置文件中。
(2) TabControl控件
該控件主要用于分欄。在該系統中一共用到了2個TabControl控件,第一個用于左欄即控制欄,該欄一共包含了2個TabPage。這兩個TabPage分別作為IOC組件的控制欄和AOP組件的控制欄。第二個TabControl控件作為顯示欄,共包含了3個TabPage:第一個用來顯示IOC的配置信息;第二個用來顯示AOP的配置信息;第三個用來實時地顯示當前正在配置的XML文件。
(3) Datagrid控件
Datagrid主要用于分行顯示讀入的構造方法的參數名或者類的屬性名。
(4) ContextMenuStrip控件
該控件作為快捷菜單出現在單擊TreeView控件某個結點后,它通常包含2個選項:“添加組件”和“刪除所有組件”。主要使用到的觸發事件就是該控件的單擊事件。
(5) OpenFileDialog控件
打開文件對話框控件,在本系統中,用于讀入要配置的組件文件。
(6) SaveFileDialog控件
保存文件對話框控件,在本系統中,用于保存配置好的XML文件到指定的位置。
(7) WebBrowser控件
Web瀏覽器控件,在本系統中,主要用來實時的顯示當前正在配置的XML文件。
除了上述設計內容外,還添加了兩個類文件作為頁面層的輔助類。主要負責一些常用的初始化代碼及其輔助性方法代碼,比如配置文件的初始化方法、DataTable的初始化方法、還有DataTable與Arraylist轉換函數等。
以上主要介紹了可視化配置工具代碼的三層結構。這三層結構是緊密聯系的,層與層之間的代碼是調用與被調用的關系。它們共同完成了可視化工具所需的功能。完成的主要功能有:
(1) 支持IOC中的構造方法注入和設值注入兩種注入方式。
(2) 可以對IOC的構造方法參數值或者屬性值進行設置或者修改;支持數組類型的構造參數。
(3) 可以設置或修改組件ID。
(4) 可以保存上次關閉時的組件及其狀態信息。
(5) 支持AOP組件配置:可以在參數設置欄設置攔截器鍵值、自動識別切面的類型等。
(6) 可以同時配置AOP和IOC組件。
3 可視化配置工具的實現和應用
通過三層結構,可視化工具就實現了預計的功能:在IOC和AOP組件存在的前提下,使用該工具可以幫助開發人員完成配置文件的生成。
3.1 IOC可視化配置工具的實現
可視化工具的IOC部分的操作方法和操作步驟如下:
(1)在左欄Component節點上單擊鼠標右鍵,選擇添加組件,如圖2,即可把組件信息載入進來;如果選擇“刪除所有組件”,就可以把樹型結構中的所有加載的組件刪除,并把IOC配置文件中的該組件標簽的全部信息相應刪除。
(2)添加完組件后單擊該組件可以查看該組件的命名空間和類名;雙擊組件可以在IOC配置欄中顯示出該組件的構造方法參數或屬性信息。該工具支持兩種IOC配置模式,即設值注入(屬性注入)和構造方法注入。在遵循一定規則的前提下可以自動區分屬性注入或構造方法注入。圖3、圖4展示的是一個設值注入(屬性注入)的實例。
3.2 AOP可視化配置工具的實現
與IOC不同,AOP的配置也需要讀入相應的類文件,根據AOP的配置特點,要分別讀入攔截器 (Interceptor)、混淆器(Mixin)和切面(Aspect對象),其中Mixin是可選項。
AOP配置界面中“參數配置”欄可以對Interceptor、Mixin設置別名,這就如同HashTable中鍵和值的一一對應關系,在使用到某個Interceptor或Mixin時可以用它的別名代替。
“Aspect配置”欄顯示了當前讀入的攔截器 (Interceptor)、混淆器(Mixin)和切面信息。根據Castle中AOP的配置原則進行相應配置后點擊“添加該方面”按鈕就可以生成對應的AOP配置文件,同樣可以查看配置結果。
圖5、圖6展示了AOP配置的過程。
4 可視化工具的插件版本
可視化配置工具的插件版本是把先前在.NET平臺下做好的Winform程序做成Sharpdevelop的插件。這是為了滿足更多開發者的需要,Sharpdevelop的靈活和輕巧博得了很多開發人員的喜愛。
可視化工具插件版本主要由兩個文件構成,一個是Dll文件,負責整個插件的功能邏輯,這部分代碼與.NET下編寫好的代碼基本一致;另一個是Addin文件,負責該插件在Sharpdevelop開發工具中出現的位置和名稱等。該插件位置設置為工具菜單下的最后一個選項。名為“組件裝配”。
圖7展示了在SharpDevelop平臺下打開“組件裝配”插件后的效果。
參考文獻
[1] 羅時灼.精通Spring[M].北京:電子工業出版社,2005:14-50.
[2] SHEN Y, CHEN H. Extending SOFL features for AOP modeling. Engineering of Complex Computer Systems, 2005,5(2):14-15.
[3] 李志純. 面向Aspect編程的應用研究[J].計算機技術與 發展, 2006,16(5):217-219.
[4] 劉曉華. 精通.NET核心技術原理與構架[M]. 北京:電子工業出版社,2002,6.
[5] 張立編著.C# 2.0寶典[M].北京:電子工業出版社,2006.