軟件體系結構風格是描述某一特定應用領域中系統組織方式的慣用模式,層次系統風格即為其中一種,本文描述了一種適用於B/S、C/S混合場景的、基於層次系統風格的系統架構解決方案。
一、 層次架構
整個系統可划分為存儲層、規約層、實現層、注入層、Web展示應用層、Web服務應用層、Client應用層共計七個層次,其中存儲層一般對應關系數據庫,其余六層是我們關注的重點。
圖1:層次架構圖示
將系統整體視作一個解決方案(Solution),觀察上圖可知,該解決方案主要包括下述九個開發項目(Project):
- Demo.Core:核心程序集,包含業務邏輯接口、數據訪問接口和實體類;
- Demo.Managers:業務邏輯層的具體實現;
- Demo.Daos:數據訪問層的具體實現,必要時可根據數據庫類型進一步細分;
- Demo.IoC:依賴注入的實現,推薦采用Spring.NET,也可以引入工廠模式以反射的方式實現;
- Demo.Controllers:基於MVC思想設計與Web界面對應的控制器,為ajax交互提供支持,不推薦采用SOAP方式;
- Demo.WebUI:瀏覽器端界面,包含html、css、js和圖片,遵循統一的界面規范;
- Demo.WebService:對外發布的web服務,供客戶端(Client)或其它應用程序調用,推薦使用SOAP方式,可專門為.NET調用者封裝WCF服務;
- Demo.ServiceProxy:web服務代理,它將實現業務邏輯接口封裝Web Service的調用,是實現層的一個特例,供客戶端(Client)或其它應用程序直接引用;
- Demo.ClientUI:PC客戶端用戶界面,同理可引入Demo.MobileUI用作手機客戶端。
單元測試並未納入上述層次架構,在實際應用中應該再添加一個Demo.UnitTest開發項目,該項目將針對Demo.Core中定義的接口編寫測試用例,這些測試用例將用作Demo.Managers、Demo.Daos項目具體接口實現類的驗收標准。
二、 編譯依賴
“層次架構”中涉及的九個開發項目之間存在一定的編譯依賴關系,如下圖所示,箭頭標明了依賴性:
圖2:編譯依賴圖示
Demo.Core不依賴其他項目;Demo.Managers 、Demo.Daos、Demo.IoC均依賴於Demo.Core;Demo.Controllers、Demo.WebService依賴於Demo.Core和Demo.IoC;Demo.WebUI依賴於Demo.Controllers;Demo.ServiceProxy需要添加Demo.WebService中web服務的引用,並非編譯依賴,故以虛線表示;Demo.ClientUI依賴於Demo.Core和Demo.IoC。
此外,Demo.WebUI、Demo.WebService的正常運行需要Demo.Managers和Demo.Daos的支撐,Demo.ClientUI的正常運行需要Demo.ServiceProxy的支撐,這種支撐將以IoC的方式配置注入,因而不存在編譯依賴關系。
三、 應用發布
Web展示應用層、Web服務應用層、Client應用層可統稱應用層,因而在應用發布商,存在Web站點、Web服務站點、Client程序三個實例,且前兩個可以二合為一。
圖3:應用發布圖示
四、 外部引用
在應用系統開發過程中,對外部程序集的引用是一種典型現象,這里將其歸納為實現層輔助工具、業務邏輯路由、面向切面附加三類。
- 實現層輔助工具:在數據訪問層(Demo.Daos)引入Spring.Data或Hibernate處理數據的存取。
- 業務邏輯路由:假設系統直接使用LDAP用戶庫,則可以添加一個實現了業務邏輯接口的適配器,將用戶處理請求轉交給LDAP服務器處理。
- 面向切面附加:面向切面即AOP,假設系統需要添加日志功能記錄所有的業務邏輯操作,則可以添加一個業務邏輯接口實現類(AgentManager),該類持有另外一個接口實現類的引用(RealManager),AgentManager並未真正實現接口要求的方法,而是轉交給RealManager處理,轉交前后可加入日志記錄代碼。
五、 架構演變
某些情況下,我們可能需要在客戶端本地緩存部分數據,此時Client程序將包含真正的業務邏輯和數據訪問功能(上文Client涉及的業務請求是由服務代理轉交Web Service處理的),Client應用層架構將演變為下圖結構。
圖4:Client演變圖示
存儲層一般采用文件級的數據庫(例如SQLite),規約層、注入層、實現層的Demo.Managers 和Demo.Daos均為通用項目。注入層將同時控制注入遠端處理邏輯(Demo.ServiceProxy)和本地處理邏輯,Demo.ClientUI根據需要自由選擇,或者直接做一個業務邏輯適配器實現自動路由。
六、 結束語
本文旨在闡述一種松耦合的架構方案,指導思想是面向接口、生產者/消費者模式,規約層以接口為核心定義標准,實現層定位為生產者,應用層為消費者。在實際應用中,上文涉及的開發項目(Project)均可進行適度的合並或拆分。
本文由Markcxz(叢興滋)撰寫於2012年3月,最早發布在其個人博客http://markcxz.cnblogs.com上,轉載請注明出處。
本文pdf下載:http://files.cnblogs.com/markcxz/BS_CS_Architecture.pdf