前面介紹了WPF的基本概念和一些相關(guān)知識,我們了解到開(kāi)發(fā)WPF應用程序可以使用現成的框架和模式,最為合適的莫過(guò)于時(shí)下正熱的MVVM模式,所以這里我們也列出針對MVVM模式的已有開(kāi)源框架:
圖3
上面除了WPFToolKit和MEF之外都是一些常用的MVVM框架,連帶自己開(kāi)發(fā)的一共是八個(gè),所以自己也取了一個(gè)響亮的名字——MVVM 八大框架!圣殿騎士本人實(shí)際項目中只用到了三個(gè)框架,之前WPF使用過(guò)MVVM Helpers,在Silverlight項目當中用過(guò)MVVMLight+MEF,后來(lái)就一直使用自己開(kāi)發(fā)的框架,其他框架也研究了很長(cháng)時(shí)間,但都是為了開(kāi)發(fā)MVVM框架借鑒之用??蚣茈m然眾多,但萬(wàn)變不離其宗,通用功能如下:
1,Model、View 和 ViewModel之間的關(guān)系:View和ViewModel如何關(guān)聯(lián)起來(lái)(IOC)以及如何通信(通常采用Message),ViewModel和Model之間的弱關(guān)聯(lián)(通常采用接口或者簡(jiǎn)單注入)。
2,事件驅動(dòng)模式在MVVM模式采用Command和Attached Behaviors的形式。
3,屬性及ViewModel的NotifyPropertyChanged處理。
4,提供完整的單元測試,這也是保證框架的穩定性和維護性的保證。
也許有一些朋友會(huì )問(wèn)我為什么要研究這么多框架,其實(shí)做項目只需要認真研究并實(shí)踐其中一個(gè)就行,研究它們的原因則主要歸功于自己開(kāi)發(fā)MVVM框架的需要。下面就讓我們來(lái)看一下具體有哪些MVVM的開(kāi)源框架(具體到每一個(gè)框架后面有時(shí)間再闡述,一篇文章寫(xiě)得確實(shí)很累):
下載地址:http://compositewpf.codeplex.com/
開(kāi)發(fā)者:微軟patterns & practices團隊
是否支持Silverlight:是
學(xué)習資料:Composite Application Guidance for WPF and Silverlight - May 2010.chm以及Quickstarts和StockTraderRI等。
源碼截圖如下:
圖4
Prism——之前又叫Composite Application Guidance for WPF and Silverlight,它是構建復雜的基于WPF/Silverlight企業(yè)級應用的主流框架。Prism中有幾個(gè)比較重要的概念:
1,BootStrapper:應用程序切入點(diǎn),繼承Prism的UnityContainer或MEF提供的MefUnityContainer,為系統提供一個(gè)容器。
2,Shell:它是一個(gè)外殼,通過(guò)UI元素和Region布局頁(yè)面。 它是應用程序的頂級窗口,顯示的內容一般就由View來(lái)填充,Shell本身并不知道它包含了哪些內容,所以功能則是由各個(gè)Module來(lái)具體提供。
3,View:它等同于MVP模式、MVVM模式中的View??梢酝ㄟ^(guò)IRegionManager注入到Region中。
4,Module:可以把一個(gè)大項目拆分開(kāi)來(lái),每一個(gè)Module都包含View、數據、模型,主要用于實(shí)現復雜業(yè)務(wù)操作。
5,IModuleManager:主要用于管理模塊加載,可以實(shí)現動(dòng)態(tài)加載。
6,IEventAggregator:事件處理接口,實(shí)現訂閱和發(fā)布模式,這也是MVVM框架的一般做法。
Prism是一個(gè)比較龐大的組合框架,4.0引入MEF及功能調整以后變得更加強大了,現在可以說(shuō)是組合框架和應用框架的統一體,而且是微軟團隊的力量,所以選它是值得保證的。
下載地址:http://caliburn.codeplex.com/
開(kāi)發(fā)者:Rob Eisenberg
是否支持Silverlight:是
學(xué)習資料:我主要參考項目實(shí)例、源碼、單元測試用例、國外一些博客和社區。
源碼截圖如下:
圖5
Caliburn中有幾個(gè)比較重要的概念:
1,在A(yíng)ctions基礎上的Commands帶有很多功能,其中包括多參數、過(guò)濾操作以及異步調用。
2,窗體和控件的生命周期事件也處理得比較好(包括activation、deactivation、shutdown等)。
3,不管是整個(gè)框架還是基于這個(gè)框架的應用程序的可測性都比較好。
4,提供了很多常用功能,這些在項目當中都比較有用。
5,除了支持MVVM模式之外,還很好的支持MVP模式以及其他的一些變種模式。
6,強大的依賴(lài)注入框架以及AOP框架,這里可以靈活選用其中一種。
Caliburn是一個(gè)非常強大的MVVM應用框架,對很多功能都提供了靈活且多種實(shí)現,不論是項目使用還是研究代碼,感覺(jué)都受益頗多。
下載地址:http://mvvmlight.codeplex.com/
開(kāi)發(fā)者:Laurent Bugnion
是否支持Silverlight:是
學(xué)習資料:除了online documentation,我主要參考項目實(shí)例、源碼、單元測試用例、國外一些博客和社區。另外這三篇文章非常不錯,用MVVMLight開(kāi)發(fā)了一個(gè)比較完整的Silverlight企業(yè)項目
源碼截圖如下:
圖6
MVVMLight中有幾個(gè)比較重要的概念:
1,RelayCommand:通過(guò)對Command進(jìn)行封裝,使得MVVM模式在WPF和Silverlight上更加容易。你只需要在 ViewModel中定義好各個(gè)RelayCommand,然后在View中通過(guò)Command來(lái)綁定ViewModel中定義好的 RelayCommand,就可以實(shí)現像WinForm、ASP.NET事件一樣的效果,只不過(guò)這里是解除了UI和邏輯的強耦合。
2,Messager:MVVMLight中的Messager作用比較大,前面講了MVVM模式解除了ViewModel和View的強引用,那么它們如何來(lái)進(jìn)行交互呢?就是靠它來(lái)讓ViewModel和View來(lái)進(jìn)行通信的。一般我們會(huì )定義一個(gè)靜態(tài)AppMessages類(lèi)來(lái)作為通用的一個(gè)通信類(lèi),原理就是發(fā)布訂閱模式。
3,EventToCommand:這里就比較類(lèi)似于附加行為的概念,是在MVVM Light Toolkit V3中開(kāi)始引入的概念。
4,ICleanup接口:當顯示某個(gè)View時(shí),需要先調用Cleanup方法清除數據,這也是由于ViewModel和View的耦合隔離產(chǎn)生的一些必要操作。
MVVMLight是一個(gè)非常好用的MVVM框架,提供了VS和Blend的模板及智能感知。它結合MEF使用真的感覺(jué)很輕量級且高效,而且提供了WPF和Silverlight的支持,尤其在Silverlight的支持上比較好,所以一般選擇輕量級的Silverlight MVVM模式,它比較被看好。
下載地址:http://mvvmhelpers.codeplex.com/
開(kāi)發(fā)者:Mark Smith
是否支持Silverlight:否
學(xué)習資料:http://www.julmar.com/blog/mark/以及提供的實(shí)例、源碼及測試用例。
源碼截圖如下:
圖7
MVVM Helpers又叫JulMar MVVM Helpers + Behaviors,其中有幾個(gè)比較重要的概念:
1,提供了MVVM模式的基本功能,包括ViewModel、View及Model之間的隔離,另外還提供了一些常用功能。
2,ViewModel的創(chuàng )建使用標簽的形式注入,現在也可以引入MEF。
3,IOC/DI的支持,屬性都有驗證機制,Wait Cursor的支持,當使用完viewmodel之后能及時(shí)釋放,這樣避免內存泄露。
4,提供了常用的Attached Behaviors支持。
5,消息機制的引入,避免強引用產(chǎn)生的耦合。
MVVM Helpers是一個(gè)非常適用的MVVM框架,尤其是提供了MVVM常用功能+MEF+Attached Behaviors,所以項目中的問(wèn)題基本都能解決。
下載地址:http://cinch.codeplex.com/
開(kāi)發(fā)者:Sacha Barber
是否支持Silverlight:否
學(xué)習資料:http://sachabarber.net/以及提供的實(shí)例、源碼及測試用例。
源碼截圖如下:
圖8
如果仔細研究其代碼,你會(huì )發(fā)現它和上面講的MVVM Helpers有很多相似的代碼,估計是相互參考了一番:-D。Cinch 中有幾個(gè)比較重要的概念:
1,這個(gè)框架在沒(méi)有MEF出現之前就已經(jīng)實(shí)現了ViewModel和View之間的強引用隔離,它既沒(méi)有一般IOC的配置,也沒(méi)有IView來(lái)做中轉,并且窗體和控件的生命周期事件也處理得比較好,所以在這方面來(lái)說(shuō)是非常不錯的。
2,提供了常用的Attached Behaviors支持,另外也提供了一些MVVM常用功能。
3,DI/IOC使用Unity實(shí)現,多線(xiàn)程的實(shí)現,避免系統出現不可預料的錯誤。
4,當使用完viewmodel之后能及時(shí)釋放,這樣避免內存泄露,驗證機制的加入,常用導航實(shí)現。
5,消息機制的引入,避免強引用產(chǎn)生的耦合。
Cinch 是一個(gè)非常強大的框架,尤其是它比較著(zhù)眼整個(gè)應用程序的搭建,所以也比較受到青睞。
下載地址:http://mvvmfoundation.codeplex.com/
開(kāi)發(fā)者:Josh Smith
是否支持Silverlight:否
學(xué)習資料:http://joshsmithonwpf.wordpress.com/以及提供的實(shí)例、源碼及測試用例。
源碼截圖如下:
圖9
MVVMFoundation中有幾個(gè)比較重要的概念:
1,Messenger:這里主要用在各種不同的ViewModel之間通信(比如相互關(guān)聯(lián)的ViewModel、主從ViewModel等),當然也可以擴展成ViewModel與View之間進(jìn)行通信。
2,ObservableObject:這里相當于ViewModelBase的概念,每一個(gè)ViewModel繼承自該類(lèi),調用完成之后立即釋放,防止內存泄露。
3,PropertyObserver:主要是對INotifyPropertyChanged.PropertyChanged進(jìn)行封裝,這樣封裝可以精簡(jiǎn)代碼,同時(shí)可以防止不當操作引起的內存泄露。
4,RelayCommand接口:封裝command的聲明,包括execution執行邏輯,可選的can-execute邏輯等。外部只需要實(shí)例化并Binding就可以簡(jiǎn)單使用。
MVVMFoundation是一個(gè)非常簡(jiǎn)單的MVVM框架,如果你覺(jué)得研究源碼比較困難,就可以先從這個(gè)框架入手,代碼簡(jiǎn)單而且精煉。
源碼截圖如下:
圖10
上面我們已經(jīng)介紹了七大MVVM框架+支持插件式的依賴(lài)注入MEF,其實(shí)另外這三個(gè)框架WPF Application Framework (WAF)、Calcium、CoreMVVM(Basic MVVM framework)也很值得研究,由于時(shí)間和精力的關(guān)系,針對這三個(gè)框架圣殿騎士也沒(méi)有進(jìn)行仔細的剖析,只是粗略看了一下基本功能。
其他一些框架諸如Onyx、nRoute、Nito MVVM、Ocean、GoodLight就沒(méi)有太多關(guān)注,有興趣的朋友也可以選擇其中某一個(gè)或多個(gè)框架作為研究和學(xué)習,不過(guò)還是推薦研究主流的框架,畢竟這些主流框架的開(kāi)發(fā)團隊和成熟度都比較強。
上面看到了這么多MVVM框架,那么我們應該怎么去學(xué)習和使用呢?簡(jiǎn)單來(lái)說(shuō)可以歸納為以下幾句話(huà):
1,根據具體的項目選擇適合的框架,團隊和項目有大有小,所以得根據這些來(lái)選擇具體的框架,其實(shí)終歸來(lái)說(shuō),幾個(gè)框架功能都比較類(lèi)似。
2,框架不用研究太多,只要適用于項目就行,尤其是熟練使用并根據其提供的TDD測試代碼追溯其原理。
3,框架不是萬(wàn)能的,對于某些應用和功能可以對框架擴展,這也開(kāi)源最大的好處之一。
針對框架的研究,自己也總結了幾點(diǎn):
1,首先看框架的相關(guān)介紹,了解相關(guān)的背景、功能、架構圖以及其他一些相關(guān)信息——認識了解。
2,根據介紹查看并調試框架所提供的實(shí)例——熟悉功能。
3,自己寫(xiě)一些相關(guān)的項目,主要是熟悉該框架,如果說(shuō)要急于做項目,后面就可以把框架引入到項目當中——具體使用。
4,根據該框架提供的詳細單元測試研究其源碼,這也是我最喜歡研究這些開(kāi)源框架的原因——原理剖析。
5,通過(guò)上面的步驟認真分析其原理及細節——準備重現。
6,自己也根據之前的思路重復開(kāi)發(fā)這個(gè)框架,最好能用TDD——框架復原捷徑。
上面我們談了一些開(kāi)源框架相關(guān)知識,下一步我們得自己開(kāi)發(fā)一個(gè)MVVM框架,一方面是對知識的總結,另一方面也是對知識的再提煉,同時(shí)也能使自己的認識提升到另一個(gè)高度,緊接下文。
由于之前自己做了一套框架,但是還沒(méi)有趨于完善,所以暫時(shí)不準備共享出來(lái)(主要是WPF和Silverlight版本更替比較頻繁且沒(méi)有加入模板及智能感知)。對于開(kāi)發(fā)一套MVVM框架,具體需要做一下幾個(gè)操作:
1,要能解決Model、View和ViewModel之間的強關(guān)聯(lián),這也是核心功能,尤其是View和ViewModel,不管是使用IOC Container還是MEF都行。
2,命令和附加事件的處理,對Command進(jìn)行封裝,滿(mǎn)足多參數、方法過(guò)濾、泛型、異步回調等,對附加事件進(jìn)行封裝,使它像使用命令一樣簡(jiǎn)便。
3,由于View和ViewModel是弱關(guān)聯(lián)或者是無(wú)關(guān)聯(lián),如何讓它們進(jìn)行通信?這就需要加入Messenger機制。
4,前面引入了消息機制(一般是靜態(tài)化處理),如何來(lái)管理、實(shí)例化、清除消息呢?這里得建立一套消息機制。
5,由于前面采用了弱關(guān)聯(lián)或者無(wú)關(guān)聯(lián),并且引入了消息機制,所以需要對操作有日志記錄,否則出了問(wèn)題無(wú)法快速定位及追查原因。
6,如何統一管理ObservableObject、PropertyObserver等這些對象呢?所以得自己建立一套變更體系。
7,對常用功能及操作進(jìn)行封裝,提供一些常用類(lèi)庫以及UI Helper等。
總之,開(kāi)發(fā)MVVM框架不能求全,只要適合項目就行,也不要想一次就能完善整個(gè)框架,在使用時(shí)不斷根據需求擴展才是明智之舉。另外附加三點(diǎn)開(kāi)發(fā)MVVM框架心得:
1,充分借鑒其他開(kāi)源框架,研究各個(gè)框架的不足和優(yōu)勢,然后把思想貫穿于自己的框架中,當然有些常用功能代碼也可以直接借鑒過(guò)來(lái)。
2,對于這樣一個(gè)比較龐大的框架,使用TDD+反復重構無(wú)疑會(huì )提高開(kāi)發(fā)效率,同時(shí)也能提高框架的可維護性和穩定性,這也是團隊使用的一個(gè)前提。
3,框架會(huì )使用一些常用設計模式,有了它們可以讓框架更具有擴展性,同時(shí)也減少了開(kāi)發(fā)成本、增加了可維護性。比如觀(guān)察者模式(消息的發(fā)布、訂閱、觸發(fā))、中介者模式(直接通信的類(lèi)轉化為中間類(lèi)來(lái)處理,隔離耦合)、外觀(guān)模式(提供一個(gè)簡(jiǎn)單的接口出來(lái),在內部進(jìn)行大量的封裝,這樣就可以起到易用且功能強大的目的)、裝飾模式(原來(lái)已經(jīng)穩定的功能模塊,如果在不改變原有結構的基礎上進(jìn)行擴展,無(wú)疑這是一個(gè)很好的實(shí)踐)等。
----------------------------------------------------------------------------------------
以下是各種開(kāi)源控件,就不介紹了。
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學(xué)習資源站點(diǎn):http://www.cnblogs.com/KnightsWarrior/archive/2010/11/01/1866641.html
聯(lián)系客服