在WinForm程序中使用MVVM開發模式
熟悉WPF的朋友一定在WPF程序中使用了MVVM的開發模式,因爲MVVM可以帶來以下幾個優點:
1. 低耦合。視圖(View)可以獨立於Model變化和修改,一個ViewModel可以綁定到不同的"View"上,當View變化的時候Model可以不變,當Model變化的時候View也可以不變。
2. 可重用性。你可以把一些視圖邏輯放在一個ViewModel裏面,讓很多view重用這段視圖邏輯。
3. 獨立開發。開發人員可以專注於業務邏輯和數據的開發(ViewModel),設計人員可以專注於頁面設計,使用Expression Blend可以很容易設計界面並生成xml代碼。
4. 可測試。界面素來是比較難於測試的,而現在測試可以針對ViewModel來寫。
那麼能否在WinForm程序中也使用MVVM模式呢,答案是肯定的。本人最近剛剛完成一個框架bedrock,已開源到此地址:https://github.com/jackhuclan/bedrock,(喜歡的朋友可以給個star)此框架的正是爲了此目的而來的。
一、 Bedrock能做什麼
Ø 各個業務模塊能夠按需動態加載,也就是實現靈活的插件式架構,實現模塊級別的分離
Ø 各個子模塊中的界面也可以靈活地呈現到主界面中,也就是實現界面區域的插件化
Ø 各個對象實例的生命週期由Unity進行管理
Ø ViewModel能由框架自動注入到View,實現與WPF一致的MVVM模式
Ø 解耦各種組件,如ViewModel,業務組件,數據訪問組件等等,有利於單元測試。
Q:1,爲什麼不直接用WPF,而是在要在WinForm程序中實現MVVM?
A:一,因爲大量歷史系統是WinForm開發的,你跟老闆說全部用WPF重寫一遍,老闆說,重寫系統這段時間不付你薪水可以嗎?
二,這些歷史系統還在生命週期中,客戶還在持續付費,但是客戶有些新的需求,你是否將新需求的代碼加入到那些已經一團糟的代碼中呢?還是以插件的方式,靈活加載進來?
三,對於歷史系統的重構應該以循序漸進的方式,而不是完全推到重建。此框架可以幫助你在歷史系統中以最小侵入實現插件式架構,模塊級別的,哪怕是頁面上一個控件級別的。
四,方便以後有機會將整個系統重構爲WPF
Q:2,這個框架和Prism很像
A:的確這個框架是在Prism的基礎上改造而來的,prism是基於WPF的,但是它的模塊加載機制,事件消息分發機制都是極好的東西,爲什麼不用?
(吾嘗終日而思矣,不如須臾之所學也;吾嘗跂而望矣,不如登高之博見也。登高而招,臂非加長也,而見者遠;順風而呼,聲非加疾也,而聞者彰。假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假於物也。--荀子《勸學》)
Q:3,這個框架有嚴格的單元測試嗎?
A:目前這個框架有305個單元測試,更多單元測試還在完善當中,開源後也希望有興趣的朋友共同參與
Q:4,這個框架開源嗎,可以免費使用嗎?
A:此框架基於MIT License,任何人和企業可以任意修改,任意分發,免費使用。
1. 演示模塊的按需加載,請參考bedrock\Quickstarts\Modularity\Modularity.sln項目,點擊ModuleB將會加載ModuleB,點擊ModuleF將會先加載ModuleF的依賴項ModuleE,然後加載ModuleF
界面展示
2. 演示子模塊界面呈現到主界面中
呈現到Form1中的效果
3. 演示組件分離,ViewModel自動注入
項目結構:
View層
ViewModel層:
Service層:
你會發現ViewModel和View是沒有直接關聯的,因此你可以很方便的爲ViewModel添加單元測試。