|
摘要
WPF企業(yè)內(nèi)訓(xùn)全程實(shí)錄由于文章比較長(zhǎng),所以一共拆分成了三篇,上篇WPF企業(yè)內(nèi)訓(xùn)全程實(shí)錄(上)主要講了基礎(chǔ),這篇作為該實(shí)錄的中篇,起著承上啟下的作用,主要講解開發(fā)模式、團(tuán)隊(duì)協(xié)作及應(yīng)用框架。其實(shí)如果大家仔細(xì)看目錄,可以發(fā)現(xiàn)我安排的順序是首先講解最基本的概念和基礎(chǔ)內(nèi)容、然后過渡到開發(fā)模式及框架、最后結(jié)合其他技術(shù)和項(xiàng)目實(shí)際運(yùn)用,這也是學(xué)習(xí)并應(yīng)用一門技術(shù)最好的流程。上篇實(shí)際上主要有兩個(gè)側(cè)重點(diǎn):一則就是理清脈絡(luò)——歷史淵源、概念引入及基本闡述;二則是講解WPFBasic——主要講解WPF的每個(gè)知識(shí)點(diǎn),涵蓋了WPF的方方面面;如果大家感興趣,可以下載代碼進(jìn)行仔細(xì)研究,如果有不懂的地方也可以參考我寫的WPF 基礎(chǔ)到企業(yè)應(yīng)用系列,這里受篇幅限制,就不詳細(xì)論述。今天的中篇主要圍繞WPF開發(fā)模式、WPF團(tuán)隊(duì)協(xié)作和MVVM框架三個(gè)議題進(jìn)行闡述,希望能給大家?guī)硪恍﹨⒖己蛶椭?/p>
章節(jié)綱要
· 1.摘要
· 2.本文提綱
· 3.簡(jiǎn)要介紹
· 4.WPF介紹
· 5.WPF基礎(chǔ)
· 6.WPF工具
· 7.WPF開發(fā)模式
· 8.WPF團(tuán)隊(duì)協(xié)作
· 9.了解并使用MVVM框架
· 10.自己開發(fā)MVVM框架
· 11.其他技術(shù)引入
· 12.WPF項(xiàng)目及性能優(yōu)化
· 13.部署與更新
· 14.總結(jié)
· 15.詳細(xì)技術(shù)索引
七. WPF開發(fā)模式
提到WPF開發(fā)模式(這里通常所說的是Presentation模式,其他層的模式不在此列),大家可能會(huì)立馬想到MVC/MVP/MVVM模式:
1,MVC:模型-視圖-控制器(Model View Controller)
2,MVP:模型-視圖-表現(xiàn)類(Model-View-Presenter)
3,MVVM:模型-視圖-視圖模型(Model-View-ViewModel)
的確,時(shí)下流行的就這三種常見的Presentation模式(這三種模式又衍生了很多變種),從根本上說這些模式是為了解決如下的幾個(gè)問題:
1,邏輯與UI緊密耦合,更換UI上的顯示往往需要更改很多邏輯代碼,正所謂“牽一發(fā)而動(dòng)全身”。
2,應(yīng)用程序狀態(tài)的維護(hù),主要包括狀態(tài) (State) , 邏輯 (Logic) ,同步 (Synchronization)耦合太緊。
3,不能使不同的UI共享相同的邏輯(復(fù)用問題)。
4,要測(cè)試用戶界面效果,你需要做復(fù)雜的UI測(cè)試。
5,團(tuán)隊(duì)協(xié)作不能充分發(fā)揮,因?yàn)轳詈咸o的關(guān)系。
6,維護(hù)比較困難,這也是由于耦合緊密且沒有完整的單元測(cè)試。
之前的C/S(WinForm)和B/S(ASP.NET/ASP.NET MVC)我們已經(jīng)習(xí)慣了MVC和MVP模式,現(xiàn)在針對(duì)WPF和Silverlight的具體特征——它帶來了3D、動(dòng)畫、音頻、視頻……這導(dǎo)致了UI的變化將更加細(xì)節(jié)化和可定制化。同時(shí),在技術(shù)層面上,WPF和 Silverlight也帶來了諸如Binding、 Dependency Property、Routed Events、Command、Attached Behavior(依賴屬性體系間接實(shí)現(xiàn))、DataTemplate、ControlTemplate等新特性。我們?cè)鯓硬拍芰⒆阌谠械募夹g(shù)框架并把WPF/Silverlight的新特性揉合進(jìn)去,以應(yīng)對(duì)客戶日益復(fù)雜且多變的需求呢?那么MVVM模式就是一個(gè)不錯(cuò)的選擇,詳見如下框架圖:
圖1
在MVVM模式中,你需要一個(gè)為View量身定制的model,那么這個(gè)model實(shí)際上就是上圖ViewModel。ViewModel包含所有UI所需要的接口、屬性和命令,這樣只需要通過Binding使他們進(jìn)行關(guān)聯(lián),就可以使二者之間達(dá)到松散耦合,所以這樣一來,UI就可以由UI專業(yè)人員用Design和Blend來實(shí)現(xiàn)(當(dāng)然很多效果還是需要用傳統(tǒng)的制圖軟件,所以我們都稱這種想法叫理想狀態(tài)),代碼人員也可以專心寫他的邏輯和業(yè)務(wù)代碼,所以這樣分工和協(xié)作變得更輕松、更愉快了。更漂亮的是View完全可以由(Unit/Automatic Test)所取代,所以單元測(cè)試也變得相對(duì)簡(jiǎn)單。這對(duì)于我們的開發(fā)人員和測(cè)試人員無疑是一個(gè)很好的解脫,同時(shí)也提高了系統(tǒng)的可測(cè)性、穩(wěn)定性和維護(hù)性。數(shù)據(jù)綁定系統(tǒng)同時(shí)也提供了標(biāo)準(zhǔn)化的方式傳輸?shù)揭晥D的錯(cuò)誤驗(yàn)證和輸入驗(yàn)證(但是個(gè)人覺得不是很好用,所以我們?cè)趯?shí)際的項(xiàng)目當(dāng)中會(huì)寫一套自己的驗(yàn)證框架)。
講到這里,我們這里不得不引入下面這幅圖,我覺得它能闡述一些比較重要問題:
圖2(注:此圖引用自Robert McCarter的MVVM一文)
上面的這幅圖表達(dá)了幾個(gè)概念:
1,Domain Model 始終是應(yīng)用程序的核心,必須投入大量精力,按照面向?qū)ο蟮姆治龊驮O(shè)計(jì) (OOAD) 最佳做法進(jìn)行設(shè)計(jì)同時(shí)按照OOP進(jìn)行開發(fā)。
2,Model、View 和 ViewModel 層之間實(shí)施嚴(yán)格的分離,也強(qiáng)調(diào)了它們之間是一種松散耦合的關(guān)系。
3,每一層或者每一個(gè)模塊都有自己完整的單元測(cè)試,這樣即提高了代碼質(zhì)量,同時(shí)也增強(qiáng)了穩(wěn)定性和可維護(hù)性。
4,不要為了MVVM而MVVM,不要強(qiáng)調(diào)UI端不產(chǎn)生一句后臺(tái)代碼而把所有代碼都扔進(jìn)ViewModel,因?yàn)橛械牟僮魅绻粎⑴c邏輯流程,放在UI端處理會(huì)更好,這也符合UI和邏輯隔離的最終原則。
當(dāng)然使用這個(gè)模式的時(shí)候,我們還要注意很多細(xì)節(jié),這個(gè)是我們必須面對(duì)的,比如我們?cè)趺磳?shí)現(xiàn)View和ViewModel關(guān)聯(lián)、View和ViewModel如何通信、ViewModel與ViewModel如何交互、ViewModel和Model之間的弱關(guān)聯(lián)、怎樣用 Attached Behavior實(shí)現(xiàn)特定命令操作、怎樣彈出UI、怎樣實(shí)現(xiàn)導(dǎo)航、Validation的自定義設(shè)置、異步調(diào)用、延遲加載、性能優(yōu)化、與傳統(tǒng)技術(shù)的交互等等問題。
八. WPF團(tuán)隊(duì)協(xié)作
前面我們講了WPF的開發(fā)模式,針對(duì)不同的開發(fā)模式,團(tuán)隊(duì)協(xié)作也會(huì)有一些具體的改變,不管是MVC、MVP還是MVVM,無疑都強(qiáng)調(diào)的是Presentation,所以我們的域模型和底層操作都不會(huì)有所變化,或者嚴(yán)格一點(diǎn)的說是只能影響到服務(wù)層/域模型之上的操作!如果不考慮多系統(tǒng)分布式、ESB及SOA體系,就可以分成以下六種角色:
專業(yè)美工人員:整個(gè)系統(tǒng)的基調(diào)與樣式、頁面布局圖、頁面效果圖、頁面的樣式與顏色、常用按鈕圖標(biāo)、常用圖標(biāo)圖片等等。
XAML人員:Style,Template,Trigger,Resource用XAML代碼書寫,另外強(qiáng)調(diào)和美工及ViewModel人員的交互與合作。
ViewModel :主要封裝領(lǐng)域模型暴露的接口,然后提供給View,所以這里強(qiáng)調(diào)UI和領(lǐng)域模型的一個(gè)適配作用。
領(lǐng)域模型(核心):應(yīng)用程序的核心,必須投入大量精力,按照面向?qū)ο蟮姆治龊驮O(shè)計(jì) (OOAD) 最佳做法進(jìn)行設(shè)計(jì)同時(shí)按照OOP進(jìn)行開發(fā)。
框架+常用功能開發(fā)人員:這里就包括MVVM框架的開發(fā)、維護(hù)以及擴(kuò)展,同時(shí)還包括數(shù)據(jù)底層訪問、日志、異常、常用功能等。
數(shù)據(jù)庫開發(fā)和管理人員:數(shù)據(jù)庫庫表的建立及維護(hù)、數(shù)據(jù)庫腳本的創(chuàng)建及維護(hù)、數(shù)據(jù)庫優(yōu)化以及日常的數(shù)據(jù)操作問題。
當(dāng)然在開發(fā)中,這六種角色也并不是完全分離的,可以根據(jù)具體需求進(jìn)行調(diào)整,同時(shí)也可以根據(jù)項(xiàng)目的功能劃分模塊,總之選擇項(xiàng)目最合適的協(xié)作方式就行。
九. 了解并使用MVVM框架
1,到底有哪些開源MVVM框架?
前面介紹了WPF的基本概念和一些相關(guān)知識(shí),我們了解到開發(fā)WPF應(yīng)用程序可以使用現(xiàn)成的框架和模式,最為合適的莫過于時(shí)下正熱的MVVM模式,所以這里我們也列出針對(duì)MVVM模式的已有開源框架:
圖3
上面除了WPFToolKit和MEF之外都是一些常用的MVVM框架,連帶自己開發(fā)的一共是八個(gè),所以自己也取了一個(gè)響亮的名字——MVVM八大框架!圣殿騎士本人實(shí)際項(xiàng)目中只用到了三個(gè)框架,之前WPF使用過MVVM Helpers,在Silverlight項(xiàng)目當(dāng)中用過MVVMLight+MEF,后來就一直使用自己開發(fā)的框架,其他框架也研究了很長(zhǎng)時(shí)間,但都是為了開發(fā)MVVM框架借鑒之用。框架雖然眾多,但萬變不離其宗,通用功能如下:
1,Model、View 和 ViewModel之間的關(guān)系:View和ViewModel如何關(guān)聯(lián)起來(IOC)以及如何通信(通常采用Message),ViewModel和Model之間的弱關(guān)聯(lián)(通常采用接口或者簡(jiǎn)單注入)。
2,事件驅(qū)動(dòng)模式在MVVM模式采用Command和Attached Behaviors的形式。
3,屬性及ViewModel的NotifyPropertyChanged處理。
4,提供完整的單元測(cè)試,這也是保證框架的穩(wěn)定性和維護(hù)性的保證。
也許有一些朋友會(huì)問我為什么要研究這么多框架,其實(shí)做項(xiàng)目只需要認(rèn)真研究并實(shí)踐其中一個(gè)就行,研究它們的原因則主要?dú)w功于自己開發(fā)MVVM框架的需要。下面就讓我們來看一下具體有哪些MVVM的開源框架(具體到每一個(gè)框架后面有時(shí)間再闡述,一篇文章寫得確實(shí)很累):
2,最強(qiáng)大且功能最多的組合框架——Prism
下載地址:http://compositewpf.codeplex.com/
開發(fā)者:微軟patterns & practices團(tuán)隊(duì)
是否支持Silverlight:是
學(xué)習(xí)資料:Composite Application Guidance for WPF and Silverlight - May 2010.chm以及Quickstarts和StockTraderRI等。
源碼截圖如下:
Prism——之前又叫Composite Application Guidance for WPF and Silverlight,它是構(gòu)建復(fù)雜的基于WPF/Silverlight企業(yè)級(jí)應(yīng)用的主流框架。Prism中有幾個(gè)比較重要的概念:
1,BootStrapper:應(yīng)用程序切入點(diǎn),繼承Prism的UnityContainer或MEF提供的MefUnityContainer,為系統(tǒng)提供一個(gè)容器。
2,Shell:它是一個(gè)外殼,通過UI元素和Region布局頁面。 它是應(yīng)用程序的頂級(jí)窗口,顯示的內(nèi)容一般就由View來填充,Shell本身并不知道它包含了哪些內(nèi)容,所以功能則是由各個(gè)Module來具體提供。
3,View:它等同于MVP模式、MVVM模式中的View。可以通過IRegionManager注入到Region中。
4,Module:可以把一個(gè)大項(xiàng)目拆分開來,每一個(gè)Module都包含View、數(shù)據(jù)、模型,主要用于實(shí)現(xiàn)復(fù)雜業(yè)務(wù)操作。
5,IModuleManager:主要用于管理模塊加載,可以實(shí)現(xiàn)動(dòng)態(tài)加載。
6,IEventAggregator:事件處理接口,實(shí)現(xiàn)訂閱和發(fā)布模式,這也是MVVM框架的一般做法。
Prism是一個(gè)比較龐大的組合框架,4.0引入MEF及功能調(diào)整以后變得更加強(qiáng)大了,現(xiàn)在可以說是組合框架和應(yīng)用框架的統(tǒng)一體,而且是微軟團(tuán)隊(duì)的力量,所以選它是值得保證的。
3,最強(qiáng)大且功能最多的應(yīng)用框架——Caliburn
下載地址:http://caliburn.codeplex.com/
開發(fā)者:Rob Eisenberg
是否支持Silverlight:是
學(xué)習(xí)資料:我主要參考項(xiàng)目實(shí)例、源碼、單元測(cè)試用例、國外一些博客和社區(qū)。
源碼截圖如下:
圖5
Caliburn中有幾個(gè)比較重要的概念:
1,在Actions基礎(chǔ)上的Commands帶有很多功能,其中包括多參數(shù)、過濾操作以及異步調(diào)用。
2,窗體和控件的生命周期事件也處理得比較好(包括activation、deactivation、shutdown等)。
3,不管是整個(gè)框架還是基于這個(gè)框架的應(yīng)用程序的可測(cè)性都比較好。
4,提供了很多常用功能,這些在項(xiàng)目當(dāng)中都比較有用。
5,除了支持MVVM模式之外,還很好的支持MVP模式以及其他的一些變種模式。
6,強(qiáng)大的依賴注入框架以及AOP框架,這里可以靈活選用其中一種。
Caliburn是一個(gè)非常強(qiáng)大的MVVM應(yīng)用框架,對(duì)很多功能都提供了靈活且多種實(shí)現(xiàn),不論是項(xiàng)目使用還是研究代碼,感覺都受益頗多。
4,輕量級(jí)且適用的MVVMLight
下載地址:http://mvvmlight.codeplex.com/
開發(fā)者:Laurent Bugnion
是否支持Silverlight:是
學(xué)習(xí)資料:除了online documentation,我主要參考項(xiàng)目實(shí)例、源碼、單元測(cè)試用例、國外一些博客和社區(qū)。另外這三篇文章非常不錯(cuò),用MVVMLight開發(fā)了一個(gè)比較完整的Silverlight企業(yè)項(xiàng)目
- Part 1 - Introduction, Installation, and General Application Design Topics
- Part 2 - MVVM Light Topics
- Part 3 - Custom Authentication, Reset Password and User Maintenance
源碼截圖如下:
圖6
MVVMLight中有幾個(gè)比較重要的概念:
1,RelayCommand:通過對(duì)Command進(jìn)行封裝,使得MVVM模式在WPF和Silverlight上更加容易。你只需要在ViewModel中定義好各個(gè)RelayCommand,然后在View中通過Command來綁定ViewModel中定義好的RelayCommand,就可以實(shí)現(xiàn)像WinForm、ASP.NET事件一樣的效果,只不過這里是解除了UI和邏輯的強(qiáng)耦合。
2,Messager:MVVMLight中的Messager作用比較大,前面講了MVVM模式解除了ViewModel和View的強(qiáng)引用,那么它們?nèi)绾蝸磉M(jìn)行交互呢?就是靠它來讓ViewModel和View來進(jìn)行通信的。一般我們會(huì)定義一個(gè)靜態(tài)AppMessages類來作為通用的一個(gè)通信類,原理就是發(fā)布訂閱模式。
3,EventToCommand:這里就比較類似于附加行為的概念,是在MVVM Light Toolkit V3中開始引入的概念。
4,ICleanup接口:當(dāng)顯示某個(gè)View時(shí),需要先調(diào)用Cleanup方法清除數(shù)據(jù),這也是由于ViewModel和View的耦合隔離產(chǎn)生的一些必要操作。
MVVMLight是一個(gè)非常好用的MVVM框架,提供了VS和Blend的模板及智能感知。它結(jié)合MEF使用真的感覺很輕量級(jí)且高效,而且提供了WPF和Silverlight的支持,尤其在Silverlight的支持上比較好,所以一般選擇輕量級(jí)的Silverlight MVVM模式,它比較被看好。
5,功能齊備且易用的MVVM Helpers
下載地址:http://mvvmhelpers.codeplex.com/
開發(fā)者:Mark Smith
是否支持Silverlight:否
學(xué)習(xí)資料:http://www.julmar.com/blog/mark/以及提供的實(shí)例、源碼及測(cè)試用例。
源碼截圖如下:
圖7
MVVM Helpers又叫JulMar MVVM Helpers + Behaviors,其中有幾個(gè)比較重要的概念:
1,提供了MVVM模式的基本功能,包括ViewModel、View及Model之間的隔離,另外還提供了一些常用功能。
2,ViewModel的創(chuàng)建使用標(biāo)簽的形式注入,現(xiàn)在也可以引入MEF。
3,IOC/DI的支持,屬性都有驗(yàn)證機(jī)制,Wait Cursor的支持,當(dāng)使用完viewmodel之后能及時(shí)釋放,這樣避免內(nèi)存泄露。
4,提供了常用的Attached Behaviors支持。
5,消息機(jī)制的引入,避免強(qiáng)引用產(chǎn)生的耦合。
MVVM Helpers是一個(gè)非常適用的MVVM框架,尤其是提供了MVVM常用功能+MEF+Attached Behaviors,所以項(xiàng)目中的問題基本都能解決。
6,功能強(qiáng)大且輕巧的Cinch
下載地址:http://cinch.codeplex.com/
開發(fā)者:Sacha Barber
是否支持Silverlight:否
學(xué)習(xí)資料:http://sachabarber.NET/以及提供的實(shí)例、源碼及測(cè)試用例。
- A walkthrough of Cinch, and its internals - Part I
- A walkthrough of Cinch, and its internals - Part II
- How to develop ViewModels using Cinch
- How to Unit test ViewModels using Cinch app, including how to test Background work threads which may run within Cinch ViewModels
- A Demo app using Cinch
源碼截圖如下:
圖8
如果仔細(xì)研究其代碼,你會(huì)發(fā)現(xiàn)它和上面講的MVVM Helpers有很多相似的代碼,估計(jì)是相互參考了一番:-D。Cinch 中有幾個(gè)比較重要的概念:
1,這個(gè)框架在沒有MEF出現(xiàn)之前就已經(jīng)實(shí)現(xiàn)了ViewModel和View之間的強(qiáng)引用隔離,它既沒有一般IOC的配置,也沒有IView來做中轉(zhuǎn),并且窗體和控件的生命周期事件也處理得比較好,所以在這方面來說是非常不錯(cuò)的。
2,提供了常用的Attached Behaviors支持,另外也提供了一些MVVM常用功能。
3,DI/IOC使用Unity實(shí)現(xiàn),多線程的實(shí)現(xiàn),避免系統(tǒng)出現(xiàn)不可預(yù)料的錯(cuò)誤。
4,當(dāng)使用完viewmodel之后能及時(shí)釋放,這樣避免內(nèi)存泄露,驗(yàn)證機(jī)制的加入,常用導(dǎo)航實(shí)現(xiàn)。
5,消息機(jī)制的引入,避免強(qiáng)引用產(chǎn)生的耦合。
Cinch 是一個(gè)非常強(qiáng)大的框架,尤其是它比較著眼整個(gè)應(yīng)用程序的搭建,所以也比較受到青睞。
7,功能簡(jiǎn)單且易擴(kuò)展的MVVMFoundation
下載地址:http://mvvmfoundation.codeplex.com/
開發(fā)者:Josh Smith
是否支持Silverlight:否
學(xué)習(xí)資料:http://joshsmithonwpf.wordpress.com/以及提供的實(shí)例、源碼及測(cè)試用例。
源碼截圖如下:
MVVMFoundation中有幾個(gè)比較重要的概念:
1,Messenger:這里主要用在各種不同的ViewModel之間通信(比如相互關(guān)聯(lián)的ViewModel、主從ViewModel等),當(dāng)然也可以擴(kuò)展成ViewModel與View之間進(jìn)行通信。
2,ObservableObject:這里相當(dāng)于ViewModelBase的概念,每一個(gè)ViewModel繼承自該類,調(diào)用完成之后立即釋放,防止內(nèi)存泄露。
3,PropertyObserver:主要是對(duì)INotifyPropertyChanged.PropertyChanged進(jìn)行封裝,這樣封裝可以精簡(jiǎn)代碼,同時(shí)可以防止不當(dāng)操作引起的內(nèi)存泄露。
4,RelayCommand接口:封裝command的聲明,包括execution執(zhí)行邏輯,可選的can-execute邏輯等。外部只需要實(shí)例化并Binding就可以簡(jiǎn)單使用。
MVVMFoundation是一個(gè)非常簡(jiǎn)單的MVVM框架,如果你覺得研究源碼比較困難,就可以先從這個(gè)框架入手,代碼簡(jiǎn)單而且精煉。
8,附加:支持插件式的依賴注入MEF
源碼截圖如下:
9,如何充分利用這些框架
上面我們已經(jīng)介紹了七大MVVM框架+支持插件式的依賴注入MEF,其實(shí)另外這三個(gè)框架WPF Application Framework (WAF)、Calcium、CoreMVVM(Basic MVVM framework)也很值得研究,由于時(shí)間和精力的關(guān)系,針對(duì)這三個(gè)框架圣殿騎士也沒有進(jìn)行仔細(xì)的剖析,只是粗略看了一下基本功能。
其他一些框架諸如Onyx、nRoute、Nito MVVM、Ocean、GoodLight就沒有太多關(guān)注,有興趣的朋友也可以選擇其中某一個(gè)或多個(gè)框架作為研究和學(xué)習(xí),不過還是推薦研究主流的框架,畢竟這些主流框架的開發(fā)團(tuán)隊(duì)和成熟度都比較強(qiáng)。
上面看到了這么多MVVM框架,那么我們應(yīng)該怎么去學(xué)習(xí)和使用呢?簡(jiǎn)單來說可以歸納為以下幾句話:
1,根據(jù)具體的項(xiàng)目選擇適合的框架,團(tuán)隊(duì)和項(xiàng)目有大有小,所以得根據(jù)這些來選擇具體的框架,其實(shí)終歸來說,幾個(gè)框架功能都比較類似。
2,框架不用研究太多,只要適用于項(xiàng)目就行,尤其是熟練使用并根據(jù)其提供的TDD測(cè)試代碼追溯其原理。
3,框架不是萬能的,對(duì)于某些應(yīng)用和功能可以對(duì)框架擴(kuò)展,這也開源最大的好處之一。
針對(duì)框架的研究,自己也總結(jié)了幾點(diǎn):
1,首先看框架的相關(guān)介紹,了解相關(guān)的背景、功能、架構(gòu)圖以及其他一些相關(guān)信息——認(rèn)識(shí)了解。
2,根據(jù)介紹查看并調(diào)試框架所提供的實(shí)例——熟悉功能。
3,自己寫一些相關(guān)的項(xiàng)目,主要是熟悉該框架,如果說要急于做項(xiàng)目,后面就可以把框架引入到項(xiàng)目當(dāng)中——具體使用。
4,根據(jù)該框架提供的詳細(xì)單元測(cè)試研究其源碼,這也是我最喜歡研究這些開源框架的原因——原理剖析。
5,通過上面的步驟認(rèn)真分析其原理及細(xì)節(jié)——準(zhǔn)備重現(xiàn)。
6,自己也根據(jù)之前的思路重復(fù)開發(fā)這個(gè)框架,最好能用TDD——框架復(fù)原捷徑。
上面我們談了一些開源框架相關(guān)知識(shí),下一步我們得自己開發(fā)一個(gè)MVVM框架,一方面是對(duì)知識(shí)的總結(jié),另一方面也是對(duì)知識(shí)的再提煉,同時(shí)也能使自己的認(rèn)識(shí)提升到另一個(gè)高度,緊接下文。
十. 自己開發(fā)MVVM框架
由于之前自己做了一套框架,但是還沒有趨于完善,所以暫時(shí)不準(zhǔn)備共享出來(主要是WPF和Silverlight版本更替比較頻繁且沒有加入模板及智能感知)。對(duì)于開發(fā)一套MVVM框架,具體需要做一下幾個(gè)操作:
1,要能解決Model、View和ViewModel之間的強(qiáng)關(guān)聯(lián),這也是核心功能,尤其是View和ViewModel,不管是使用IOC Container還是MEF都行。
2,命令和附加事件的處理,對(duì)Command進(jìn)行封裝,滿足多參數(shù)、方法過濾、泛型、異步回調(diào)等,對(duì)附加事件進(jìn)行封裝,使它像使用命令一樣簡(jiǎn)便。
3,由于View和ViewModel是弱關(guān)聯(lián)或者是無關(guān)聯(lián),如何讓它們進(jìn)行通信?這就需要加入Messenger機(jī)制。
4,前面引入了消息機(jī)制(一般是靜態(tài)化處理),如何來管理、實(shí)例化、清除消息呢?這里得建立一套消息機(jī)制。
5,由于前面采用了弱關(guān)聯(lián)或者無關(guān)聯(lián),并且引入了消息機(jī)制,所以需要對(duì)操作有日志記錄,否則出了問題無法快速定位及追查原因。
6,如何統(tǒng)一管理ObservableObject、PropertyObserver等這些對(duì)象呢?所以得自己建立一套變更體系。
7,對(duì)常用功能及操作進(jìn)行封裝,提供一些常用類庫以及UI Helper等。
總之,開發(fā)MVVM框架不能求全,只要適合項(xiàng)目就行,也不要想一次就能完善整個(gè)框架,在使用時(shí)不斷根據(jù)需求擴(kuò)展才是明智之舉。另外附加三點(diǎn)開發(fā)MVVM框架心得:
1,充分借鑒其他開源框架,研究各個(gè)框架的不足和優(yōu)勢(shì),然后把思想貫穿于自己的框架中,當(dāng)然有些常用功能代碼也可以直接借鑒過來。
2,對(duì)于這樣一個(gè)比較龐大的框架,使用TDD+反復(fù)重構(gòu)無疑會(huì)提高開發(fā)效率,同時(shí)也能提高框架的可維護(hù)性和穩(wěn)定性,這也是團(tuán)隊(duì)使用的一個(gè)前提。
3,框架會(huì)使用一些常用設(shè)計(jì)模式,有了它們可以讓框架更具有擴(kuò)展性,同時(shí)也減少了開發(fā)成本、增加了可維護(hù)性。比如觀察者模式(消息的發(fā)布、訂閱、觸發(fā))、中介者模式(直接通信的類轉(zhuǎn)化為中間類來處理,隔離耦合)、外觀模式(提供一個(gè)簡(jiǎn)單的接口出來,在內(nèi)部進(jìn)行大量的封裝,這樣就可以起到易用且功能強(qiáng)大的目的)、裝飾模式(原來已經(jīng)穩(wěn)定的功能模塊,如果在不改變?cè)薪Y(jié)構(gòu)的基礎(chǔ)上進(jìn)行擴(kuò)展,無疑這是一個(gè)很好的實(shí)踐)等。
總結(jié)
上篇WPF企業(yè)內(nèi)訓(xùn)全程實(shí)錄(上)主要講解歷史淵源、概念引入、基本闡述以及WPF的每個(gè)知識(shí)點(diǎn)。這篇主要主要圍繞WPF開發(fā)模式、WPF團(tuán)隊(duì)協(xié)作和MVVM框架三個(gè)議題進(jìn)行闡述。下篇將著重強(qiáng)調(diào)結(jié)合其他技術(shù)共同打造WPF項(xiàng)目、相關(guān)性能優(yōu)化、以及部署與更新問題,所以敬請(qǐng)期待!另外如果有不懂的地方也可以參考之前寫的WPF 基礎(chǔ)到企業(yè)應(yīng)用系列,最后聲明一下,由于圣殿騎士才識(shí)淺薄,所以以上觀點(diǎn)只是個(gè)人的看法與心得,遺漏和錯(cuò)誤之處也敬請(qǐng)海涵。懷著技術(shù)分享與交流的態(tài)度分享出來,希望各位多多指教!
NET技術(shù):WPF 企業(yè)內(nèi)訓(xùn)全程實(shí)錄(中),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。