1. 程式人生 > >MVVM架構模式 入門(三)MVVM模式的常用框架:MVVM Light輕量級、Prism重量級等等

MVVM架構模式 入門(三)MVVM模式的常用框架:MVVM Light輕量級、Prism重量級等等

http://www.cnblogs.com/tianciliangen/p/7890742.html

實現MVVM的框架有很多,如:

• MVVM Light Toolkit: http://mvvmlight.codeplex.com

• Microsoft Prism http://compositewpf.codeplex.com/

• Calcium SDK http://calciumsdk.net/

• Caliburn http://caliburn.codeplex.com/

•Caliburn  Micro http://caliburnmicro.codeplex.com/

• Silverlight.FX: http://projects.nikhilk.net/SilverlightFX

• nRoute: http://nroute.codeplex.com

MVVM Light Toolkit

http://www.galasoft.ch/mvvm/getstarted/

MEFedMVVM

http://mefedmvvm.codeplex.com/

Cinch

http://cinch.codeplex.com/

,此處選擇兩個比較常見的分析一下

MVVM Light

http://www.galasoft.ch/mvvm/getstarted

http://mvvmlight.codeplex.com

輕量級框架,很簡單

Prism

http://compositewpf.codeplex.com

前身Composite Application Guidance for WPF and Silverlight

重量級,初次使用有些複雜

MVVM Light Toolkit or Prism

http://forums.silverlight.net/forums/p/153083/343298.aspx

 

 

前面介紹了WPF的基本概念和一些相關知識,我們瞭解到開發WPF應用程式可以使用現成的框架和模式,最為合適的莫過於時下正熱的MVVM模式,所以這裡我們也列出針對MVVM模式的已有開源框架:

2010-10-31 22-51-52

 

 

上面除了WPFToolKit和MEF之外都是一些常用的MVVM框架,連帶自己開發的一共是八個,所以自己也取了一個響亮的名字——MVVM 八大框架!聖殿騎士本人實際專案中只用到了三個框架,之前WPF使用過MVVMHelpers,在Silverlight專案當中用過MVVMLight+MEF,後來就一直使用自己開發的框架,其他框架也研究了很長時間,但都是為了開發MVVM框架借鑑之用。框架雖然眾多,但萬變不離其宗,通用功能如下:

1,Model、View 和 ViewModel之間的關係:View和ViewModel如何關聯起來(IOC)以及如何通訊(通常採用Message),ViewModel和Model之間的弱關聯(通常採用介面或者簡單注入)。

2,事件驅動模式在MVVM模式採用Command和Attached Behaviors的形式。

3,屬性及ViewModel的NotifyPropertyChanged處理。

4,提供完整的單元測試,這也是保證框架的穩定性和維護性的保證。

  也許有一些朋友會問我為什麼要研究這麼多框架,其實做專案只需要認真研究並實踐其中一個就行,研究它們的原因則主要歸功於自己開發MVVM框架的需要。下面就讓我們來看一下具體有哪些MVVM的開源框架(具體到每一個框架後面有時間再闡述,一篇文章寫得確實很累):

2,最強大且功能最多的組合框架——Prism

下載地址:http://compositewpf.codeplex.com/

開發者:微軟patterns & practices團隊

是否支援Silverlight:是

學習資料:Composite Application Guidance for WPF and Silverlight - May 2010.chm以及Quickstarts和StockTraderRI等。

原始碼截圖如下:

2010-10-6 23-54-02

                                             圖4

  Prism——之前又叫Composite Application Guidance for WPF and Silverlight,它是構建複雜的基於WPF/Silverlight企業級應用的主流框架。Prism中有幾個比較重要的概念:

1,BootStrapper:應用程式切入點,繼承Prism的UnityContainer或MEF提供的MefUnityContainer,為系統提供一個容器。

2,Shell:它是一個外殼,通過UI元素和Region佈局頁面。 它是應用程式的頂級視窗,顯示的內容一般就由View來填充,Shell本身並不知道它包含了哪些內容,所以功能則是由各個Module來具體提供。

3,View:它等同於MVP模式、MVVM模式中的View。可以通過IRegionManager注入到Region中。

4,Module:可以把一個大專案拆分開來,每一個Module都包含View、資料、模型,主要用於實現複雜業務操作。

5,IModuleManager:主要用於管理模組載入,可以實現動態載入。

6,IEventAggregator:事件處理介面,實現訂閱和釋出模式,這也是MVVM框架的一般做法。

  Prism是一個比較龐大的組合框架,4.0引入MEF及功能調整以後變得更加強大了,現在可以說是組合框架和應用框架的統一體,而且是微軟團隊的力量,所以選它是值得保證的。

3,最強大且功能最多的應用框架——Caliburn

下載地址:

 ■  http://caliburn.codeplex.com/

 ■GitHub  https://github.com/lbugnion/mvvmlight

開發者:Rob Eisenberg

是否支援Silverlight:是

學習資料:我主要參考專案例項、原始碼、單元測試用例、國外一些部落格和社群。

原始碼截圖如下:

2010-10-31 22-50-51

                                             圖5

Caliburn中有幾個比較重要的概念:

1,在Actions基礎上的Commands帶有很多功能,其中包括多引數、過濾操作以及非同步呼叫。

2,窗體和控制元件的生命週期事件也處理得比較好(包括activation、deactivation、shutdown等)。

3,不管是整個框架還是基於這個框架的應用程式的可測性都比較好。

4,提供了很多常用功能,這些在專案當中都比較有用。

5,除了支援MVVM模式之外,還很好的支援MVP模式以及其他的一些變種模式。

6,強大的依賴注入框架以及AOP框架,這裡可以靈活選用其中一種。

Caliburn是一個非常強大的MVVM應用框架,對很多功能都提供了靈活且多種實現,不論是專案使用還是研究程式碼,感覺都受益頗多。

4,輕量級且適用的MVVMLight

下載地址:http://mvvmlight.codeplex.com/

開發者:Laurent Bugnion

是否支援Silverlight:是

學習資料:除了online documentation,我主要參考專案例項、原始碼、單元測試用例、國外一些部落格和社群。另外這三篇文章非常不錯,用MVVMLight開發了一個比較完整的Silverlight企業專案

原始碼截圖如下:

2010-10-21 16-22-04

                                             圖6

MVVMLight中有幾個比較重要的概念:

1,RelayCommand:通過對Command進行封裝,使得MVVM模式在WPF和Silverlight上更加容易。你只需要在 ViewModel中定義好各個RelayCommand,然後在View中通過Command來繫結ViewModel中定義好的 RelayCommand,就可以實現像WinForm、ASP.NET事件一樣的效果,只不過這裡是解除了UI和邏輯的強耦合。

2,Messager:MVVMLight中的Messager作用比較大,前面講了MVVM模式解除了ViewModel和View的強引用,那麼它們如何來進行互動呢?就是靠它來讓ViewModel和View來進行通訊的。一般我們會定義一個靜態AppMessages類來作為通用的一個通訊類,原理就是釋出訂閱模式。

3,EventToCommand:這裡就比較類似於附加行為的概念,是在MVVM Light Toolkit V3中開始引入的概念。

4,ICleanup介面:當顯示某個View時,需要先呼叫Cleanup方法清除資料,這也是由於ViewModel和View的耦合隔離產生的一些必要操作。

  MVVMLight是一個非常好用的MVVM框架,提供了VS和Blend的模板及智慧感知。它結合MEF使用真的感覺很輕量級且高效,而且提供了WPF和Silverlight的支援,尤其在Silverlight的支援上比較好,所以一般選擇輕量級的Silverlight MVVM模式,它比較被看好。

5,功能齊備且易用的MVVM Helpers

下載地址:http://mvvmhelpers.codeplex.com/

開發者:Mark Smith

是否支援Silverlight:否

學習資料:http://www.julmar.com/blog/mark/以及提供的例項、原始碼及測試用例。

原始碼截圖如下:

2010-10-21 16-25-14

                                             圖7

MVVM Helpers又叫JulMar MVVM Helpers + Behaviors,其中有幾個比較重要的概念:

1,提供了MVVM模式的基本功能,包括ViewModel、View及Model之間的隔離,另外還提供了一些常用功能。

2,ViewModel的建立使用標籤的形式注入,現在也可以引入MEF。

3,IOC/DI的支援,屬性都有驗證機制,Wait Cursor的支援,當使用完viewmodel之後能及時釋放,這樣避免記憶體洩露。

4,提供了常用的Attached Behaviors支援。

5,訊息機制的引入,避免強引用產生的耦合。

MVVM Helpers是一個非常適用的MVVM框架,尤其是提供了MVVM常用功能+MEF+Attached Behaviors,所以專案中的問題基本都能解決。

6,功能強大且輕巧的Cinch

下載地址:http://cinch.codeplex.com/

開發者:Sacha Barber

是否支援Silverlight:否

學習資料:http://sachabarber.net/以及提供的例項、原始碼及測試用例。

  1. A walkthrough of Cinch, and its internals - Part I
  2. A walkthrough of Cinch, and its internals - Part II
  3. How to develop ViewModels using Cinch
  4. How to Unit test ViewModels using Cinch app, including how to test Background work threads which may run within Cinch ViewModels
  5. A Demo app using Cinch

原始碼截圖如下:

2010-10-21 16-34-31

                                             圖8

如果仔細研究其程式碼,你會發現它和上面講的MVVM Helpers有很多相似的程式碼,估計是相互參考了一番:-D。Cinch 中有幾個比較重要的概念:

1,這個框架在沒有MEF出現之前就已經實現了ViewModel和View之間的強引用隔離,它既沒有一般IOC的配置,也沒有IView來做中轉,並且窗體和控制元件的生命週期事件也處理得比較好,所以在這方面來說是非常不錯的。

2,提供了常用的Attached Behaviors支援,另外也提供了一些MVVM常用功能。

3,DI/IOC使用Unity實現,多執行緒的實現,避免系統出現不可預料的錯誤。

4,當使用完viewmodel之後能及時釋放,這樣避免記憶體洩露,驗證機制的加入,常用導航實現。

5,訊息機制的引入,避免強引用產生的耦合。

Cinch 是一個非常強大的框架,尤其是它比較著眼整個應用程式的搭建,所以也比較受到青睞。

7,功能簡單且易擴充套件的MVVMFoundation

下載地址:http://mvvmfoundation.codeplex.com/

開發者:Josh Smith

是否支援Silverlight:否

學習資料:http://joshsmithonwpf.wordpress.com/以及提供的例項、原始碼及測試用例。

原始碼截圖如下:

2010-10-21 16-22-57

                                             圖9

MVVMFoundation中有幾個比較重要的概念:

1,Messenger:這裡主要用在各種不同的ViewModel之間通訊(比如相互關聯的ViewModel、主從ViewModel等),當然也可以擴充套件成ViewModel與View之間進行通訊。

2,ObservableObject:這裡相當於ViewModelBase的概念,每一個ViewModel繼承自該類,呼叫完成之後立即釋放,防止記憶體洩露。

3,PropertyObserver:主要是對INotifyPropertyChanged.PropertyChanged進行封裝,這樣封裝可以精簡程式碼,同時可以防止不當操作引起的記憶體洩露。

4,RelayCommand介面:封裝command的宣告,包括execution執行邏輯,可選的can-execute邏輯等。外部只需要例項化並Binding就可以簡單使用。

MVVMFoundation是一個非常簡單的MVVM框架,如果你覺得研究原始碼比較困難,就可以先從這個框架入手,程式碼簡單而且精煉。

8,附加:支援外掛式的依賴注入MEF

下載地址:http://mef.codeplex.com/

原始碼截圖如下:

2010-10-21 16-20-52

                                             圖10

9,如何充分利用這些框架

  上面我們已經介紹了七大MVVM框架+支援外掛式的依賴注入MEF,其實另外這三個框架WPF Application Framework (WAF)CalciumCoreMVVM(Basic MVVM framework)也很值得研究,由於時間和精力的關係,針對這三個框架聖殿騎士也沒有進行仔細的剖析,只是粗略看了一下基本功能。

其他一些框架諸如OnyxnRouteNito MVVMOceanGoodLight就沒有太多關注,有興趣的朋友也可以選擇其中某一個或多個框架作為研究和學習,不過還是推薦研究主流的框架,畢竟這些主流框架的開發團隊和成熟度都比較強。

上面看到了這麼多MVVM框架,那麼我們應該怎麼去學習和使用呢?簡單來說可以歸納為以下幾句話:

1,根據具體的專案選擇適合的框架,團隊和專案有大有小,所以得根據這些來選擇具體的框架,其實終歸來說,幾個框架功能都比較類似。

2,框架不用研究太多,只要適用於專案就行,尤其是熟練使用並根據其提供的TDD測試程式碼追溯其原理。

3,框架不是萬能的,對於某些應用和功能可以對框架擴充套件,這也開源最大的好處之一。

針對框架的研究,自己也總結了幾點:

1,首先看框架的相關介紹,瞭解相關的背景、功能、架構圖以及其他一些相關資訊——認識瞭解。

2,根據介紹檢視並除錯框架所提供的例項——熟悉功能。

3,自己寫一些相關的專案,主要是熟悉該框架,如果說要急於做專案,後面就可以把框架引入到專案當中——具體使用。

4,根據該框架提供的詳細單元測試研究其原始碼,這也是我最喜歡研究這些開源框架的原因——原理剖析。

5,通過上面的步驟認真分析其原理及細節——準備重現。

6,自己也根據之前的思路重複開發這個框架,最好能用TDD——框架復原捷徑。

  上面我們談了一些開源框架相關知識,下一步我們得自己開發一個MVVM框架,一方面是對知識的總結,另一方面也是對知識的再提煉,同時也能使自己的認識提升到另一個高度,緊接下文。

十. 自己開發MVVM框架

  由於之前自己做了一套框架,但是還沒有趨於完善,所以暫時不準備共享出來(主要是WPF和Silverlight版本更替比較頻繁且沒有加入模板及智慧感知)。對於開發一套MVVM框架,具體需要做一下幾個操作:

1,要能解決Model、View和ViewModel之間的強關聯,這也是核心功能,尤其是View和ViewModel,不管是使用IOC Container還是MEF都行。

2,命令和附加事件的處理,對Command進行封裝,滿足多引數、方法過濾、泛型、非同步回撥等,對附加事件進行封裝,使它像使用命令一樣簡便。

3,由於View和ViewModel是弱關聯或者是無關聯,如何讓它們進行通訊?這就需要加入Messenger機制。

4,前面引入了訊息機制(一般是靜態化處理),如何來管理、例項化、清除訊息呢?這裡得建立一套訊息機制。

5,由於前面採用了弱關聯或者無關聯,並且引入了訊息機制,所以需要對操作有日誌記錄,否則出了問題無法快速定位及追查原因。

6,如何統一管理ObservableObject、PropertyObserver等這些物件呢?所以得自己建立一套變更體系。

7,對常用功能及操作進行封裝,提供一些常用類庫以及UI Helper等。

  總之,開發MVVM框架不能求全,只要適合專案就行,也不要想一次就能完善整個框架,在使用時不斷根據需求擴展才是明智之舉。另外附加三點開發MVVM框架心得:

1,充分借鑑其他開源框架,研究各個框架的不足和優勢,然後把思想貫穿於自己的框架中,當然有些常用功能程式碼也可以直接借鑑過來。

2,對於這樣一個比較龐大的框架,使用TDD+反覆重構無疑會提高開發效率,同時也能提高框架的可維護性和穩定性,這也是團隊使用的一個前提。

3,框架會使用一些常用設計模式,有了它們可以讓框架更具有擴充套件性,同時也減少了開發成本、增加了可維護性。比如觀察者模式(訊息的釋出、訂閱、觸發)、中介者模式(直接通訊的類轉化為中間類來處理,隔離耦合)、外觀模式(提供一個簡單的接口出來,在內部進行大量的封裝,這樣就可以起到易用且功能強大的目的)、裝飾模式(原來已經穩定的功能模組,如果在不改變原有結構的基礎上進行擴充套件,無疑這是一個很好的實踐)等。

----------------------------------------------------------------------------------------

 

 

以下是各種開源控制元件,就不介紹了。

Fluent Ribbon Control Suite


Microsoft Ribbon for WPF


AvalonDock


PropertyEditor for WPF


WPF Property Grid


PropertyInspectorView


WPF Dynamic Data Display


Swordfist WPF Charts


WPF Toolkit


AvalonEdit

wpf學習資源站點:http://www.cnblogs.com/KnightsWarrior/archive/2010/11/01/1866641.html

連結地址:http://www.cnblogs.com/mrchenzh/archive/2012/05/23/2514931.html