一種應用程式命令執行架構設計
袁永福 2011-7-5
有感於一些程式中ASPX頁面中直接編寫功能性代碼,難於組織和維護,實現不了程式的高度可配置化,自此提出一種應用程式命令執行架構,其架構圖如下
在這個架構中,每一個應用程式中存在一個Host(宿主),它是應用程式功能模組組織中的頂級結構,它戰略上管理著整個應用系統的功能點,而且是訪問本架構的進入點。
Host下面有若干個Module(功能模組),Module對象Name屬性用於進行標識,有Start和Stop方法用於啟動和停止功能模組。[袁永福著作權]
每一個功能模組下有若干個Command(命令),而一個個Command對象就實現了具體的功能點,Command對象有Name屬性用於進行標識,對於WinForm程式,還提供快速鍵、按鈕表徵圖、提示文本等屬性。在具體的寫代碼中,可以Module類中定義一個個功能模組方法,然後通過反射產生一個個委託,並封裝成Command對象;也可以從Command公用基礎類型定義一個個實現具體功能的功能點類型。[袁永福著作權]
這樣整個應用程式通過“Host — Module — Command”三級結構將所有的功能點組織在一起。Module可以動態掛在Host下面而無需寫入程式碼,這樣可以實現外掛程式式的軟體功能機制,若精心設計還能搞出軟體模組熱拔插的機制。
Host下面還有Session(會話),Session是一個運行時的資料容器,Command中的功能模組可以通過它來臨時儲存和共用資料,當Host關閉時Session中的資料會被清空。使用Session能減少各個Command的耦合性,保證系統的變形金剛的功能。在實現時,對於ASP.NET程式,這裡的Session可以是ASP.NET Session的封裝;對於WinForm程式,Session可以是一個字典列表對象。
Host下面掛著Config(配置),[袁永福著作權]Config是一個資料容器,其功能和Session類似,但其中的資料會被自動的持久化的。當Host關閉時,Config中的資料會自動保持到系統設定檔或者資料庫中,當Host啟動時系統又會從設定檔或資料庫中載入上次儲存的Config資料。各個Module或Command都可以使用各自的系統配置資料,這也能減少功能模組之間的耦合性。
Host下面還掛著UI Controler(使用者介面控制器),UI Controler用於訪問使用者介面,它下面掛著若干個Form(使用者介面表單對象),對於WinForm程式是一個個表單或使用者控制項,對於ASP.NET這是一個個ASPX頁面或使用者控制項。
每一個Form下面有著若干個功能性控制項,比如菜單、按鈕等等。這些功能性控制項通過一種Binding機制綁定到Host下面掛著得所有的Command對象。當程式運行時,使用者按下命令按鈕,則通過綁定機制觸發Command對象,從而執行Command對象的功能性代碼來完成某項功能。
由於採用Binding機制,這樣在開發時不是直接處理菜單、按鈕的點擊事件,而是設定菜單、按鈕的Binding相關屬性。這種機制使得開發和維護使用者介面變得很靈活。程式員只要把一個個Command對象實現好,而使用者介面可以任意設計,後台代碼基本上不需要修改。[袁永福著作權]
而且Binding機制能實現反向控制操作,當執行了某個操作使得一些Command的狀態發生改變,比如可用狀態、可見狀態等等。此時系統會自動更新使用者介面中的控制項狀態,比如設定菜單、按鈕灰化使其不可用等等。
為了能讓Binding機制可行,需要提供很強的設計時支援,使得開發人員在開發應用程式使用者介面時能很方便的將菜單、按鈕和Command對象進行綁定,在這方面VS.NET沒有任何問題。
另外Command對象可以通過UI Controler來訪問使用者介面,這能避免功能性代碼直接存取使用者介面,降低後台功能性代碼和使用者介面的耦合度[袁永福著作權]。
Host下面還掛著Permission(授權),這是進行授權控制,在程式運行時使用者按下菜單、按鈕通過Binding機制觸發Command對象,在最後的關頭系統會自動調用Permission來進行Validate(驗證)。若驗證通過則觸發Command對象,若驗證不通過則啥都不會發生。而且根據授權資訊還能更新使用者介面的功能控制項狀態,比如某個Command通過不授權,使用者沒有許可權調用,則自動化佈建綁定到該Command的菜單、按鈕灰化,使其不可用。
當然使用者介面控制項可以映射到Command對象,開發人員編寫的後台代碼(User Code)也可以觸發Command對象,此時也會通過授權驗證。
在實現中,Binding機制或者User Code都不能直接存取Command對象,而且使用命令名通過Host來尋找Command對象並在Host內部的代碼中觸發,在Host內部觸發Command對象前就可以調用Permission對象執行驗證。
通過這種應用程式命令執行架構,系統的功能和使用者介面從邏輯上分開了,實現了外掛程式式的軟體功能架構,這種架構能促使開發人員開發出能在多重專案中都能使用的程式功能模組,這些功能模組經過標準化就是產品,因此這種架構能為項目的產品化打下一個良好的技術基礎。
而且對於已有系統,可以將頁面對象改造成Module,實現Form和Module在形式上的統一而邏輯上的分開,這樣能低成本的改造舊系統,保護客戶的已有投資。
以上是我提出的一種應用程式命令執行架構,歡迎拍磚。[袁永福著作權]