近期接手到一個已經成型的項目,然后我們的任務就是對它進行重構,這個項目是一個功能非常齊全的WPF視頻播放器(附帶非常多其它功能),在細致研究了項目的背景和架構以后,初步做出了一下的重構方案:
眼下現狀:
盡管整個系統做得非常美麗,代碼也寫得不錯。但仍有下面不足:
- 架構有待改善。
盡管看似MVC架構,卻沒有遵循MVC的模式。里面邏輯和UI耦合非常高,沒有清晰的規律。
- 沒有充分用到WPF的特性。WPF除了給我們非常多炫麗的效果外。還給我們提供了諸如Binding,command等特性,這些特性能夠幫我們隔開耦合,同一時候降低代碼量。
- 代碼和文件沒有組織。代碼、dll、樣式文件和資源文件等沒有統一的組織,到處都有。這樣看起來就會非常混亂。
- 沒有建立公用代碼庫。沒有把公用的代碼庫獨立出來,非常多地方都是另外在寫,這樣既添加了代碼量,同一時候維護和重構也帶來了麻煩。
- 邏輯處理不應暴露在Client端。項目是一個C/S架構的系統。沒有必要把全部的邏輯都暴露在Client端。應該用分布式把Logic放在server端。這樣能夠更安全同一時候使client變小。
- 沒有單元測試。這樣一個龐大的程序,沒有單元測試是非常危急的。我們不可能做到100%的覆蓋率,可是我們能夠對基本的邏輯和Function做單元測試。這樣既降低了測試人員的工作量同一時候整個系統的安全、穩定和可維護性得到了大大的提高。
- 性能不夠優化。啟動項目,通過WPF性能工具Perforator和Visual Profiler分析得出,程序啟動和界面操作都導致CPU非常高。內存也消耗比較多。
解決方式
- 針對缺陷1的“架構問題”。
做法是採用MVP或者MVVM模式。眼下正在對照和考慮。
- 針對缺陷2的“WPF特性”。
做法是充分利用Binding,command等特性。
- 針對缺陷3的“代碼和文件沒有組織”。做法是建立一些單獨的project或者文件來分類和組織這些代碼,而且充分隔離耦合。
- 針對缺陷4的“沒有建立公用代碼庫”。
做法是把一些公用的代碼和經常使用的代碼做成單獨的Dll,而且有完整的單元測試,這樣才干提高效率。
- 針對缺陷5的“邏輯處理不應暴露在Client端”。做法是用WCF做為中間層。把業務邏輯所有進行封裝。通過WCF提供統一的接口供項目調用。
- 針對缺陷6的“沒有單元測試”。
做法是無論用MVP還是MVVM,我們起碼保證對邏輯組件的代碼有充分的單元測試覆蓋,同一時候對一些公用的組件也要有單獨的單元測試代碼。
- 針對缺陷7的“性能不夠優化”。這個我會單獨做一個性能優化列表出來,針對耗資源的操作和其它有損害性能的操作,我們應該避免。
- 那么我們就能夠結合實際情況搭建例如以下的結構
-

- 由於使用了MVVM模式,所以UI結構圖就做例如以下調整

- 由於整個項目客戶部希望我們引用第三方的組件或者工具。所以非常多功能都僅僅能通過企業庫實現。比方AOP和IOC,log和exception對項目特征做了定制化,數據訪問通過企業庫重寫實現局部ORM,對性能要求比較高的應用仍然實現存儲過程。對所有事務操作都轉移到數據庫。郵件使用JOB進行發送。
大型數據和客戶要求較高的實時操作。用MSMQ和SSB相結合的方式。
層次依賴關系
UI: 功能模塊使用時候,都會首先通過UI層次Security模塊的安全驗證(驗證是通過Components模塊里面的自己定義的用於頁面功能以及功能點驗證的控件觸發), Security模塊會通過服務層獲取用戶身份數據,用於頁面驗證.
功能模塊的實際功能實現,假設須要數據庫支持,那么依舊會通過服務層進行數據操作.整個架構基於MVVM模式。
Service:通過WCF做中間服務。使應用隔離開來,這樣有利於擴展和維護。同事提高了整個應用程序的伸縮性。
Business Logic: 服務層內部之間的組合關系,主要體現再依賴和調用,由上往下調用,逐級依賴,最后Service底層邊界Data Access模塊將調用Framework中的Data模塊,Data模塊將調用MS.EntLib3中的Data,向數據server發送數據操作命令和數據.
Framework: 該層次提供很多基礎的功能模塊(七大塊),分別提供給UI,Service層里面的模塊直接或者間接的調用,同一時候也能夠看到Framework層次內部各模塊之間再執行時也有互相依賴調用的關系存在.該層次的部分模塊會依賴和調用Ms.EntLib3中的模塊,通常是依照兩個層次里面的模塊名稱,產生關系的.
MS.EntLib3: 該層次的各個模塊是整個系統框架中最底層的,僅僅會在執行時被更高層次的模塊依賴和調用,同一時候該層次內部各個模塊之間也存在依賴和執行時調用關系.
整個架構採用迭代的方式進行開發。這樣方便客戶進行實時反饋,因為如今還沒有開始,所以有非常多時間進行准備,假設園子里有這方面經驗的朋友,也能夠暢所欲言,謝謝!

