ylbtech-架構-MVVM:MVVM核心概念 |
1.返回頂部 |
MVVM模式是Model、View、ViewModel的簡稱,最早出現在WPF,現在Silverlight中也使用該模式,MVVM模式是對MVC模式的變種。哪兒變了?我認為MVVM和MVC的主要變化在於MVVM更適合於XAML。
MVVM模式和MVC模式一樣,主要目的是分離視圖(View)和模型(Model),有幾大好處
1. 低耦合。視圖(View)可以獨立於Model變化和修改,一個ViewModel可以綁定到不同的"View"上,當View變化的時候Model不可以不變,當Model變化的時候View也可以不變。
2. 可重用性。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯。
3. 獨立開發。開發人員可以專注於業務邏輯和數據的開發(ViewModel),設計人員可以專注於頁面設計,使用Expression Blend可以很容易設計界面並生成xaml代碼。
4. 可測試。界面素來是比較難於測試的,而現在測試可以針對ViewModel來寫。
如果用Interface接口來表達,基本就是這么個意思:
publicinterface IView { IViewModel ViewModel { get; set; } } publicinterface IViewModel { IModel Model { get; set; } ///<summary> /// a property that states the controller is busy doing something (like fetching data from a service), /// usually the iterface should be blocked ///</summary> bool IsBusy { get; } }
MVVM的Model、View、ViewModel分工
1. View
- 負責界面和顯示,界面構成元素有window, controls, page, dataTemplete, custom controls….
- 代碼通常有XAML和XAML.CS組成,但后台代碼應該很少
- 通過DataContext和ViewModel綁定
- 不直接和Model交互!
- 控件可以和ViewModel的公共屬性綁定,update需要雙向綁定
- 控件可以觸發Behavior/Command調用ViewModel的方法,Command是View到ViewModel的單向通訊 (View中觸發事件,ViewModel中處理事件)
2. ViewModel
- 主要包括界面邏輯和模型數據封裝,Behavior/Command事件響應,綁定的屬性定義等
- ViewModel繼承Model類,或者是Model的繼承類
- 是view和model的橋梁,是對Model的抽象,例如,model中數據格式是“年月日”,可以在viewModel中轉換model中的數據為“日月年”以供視圖(view)顯示。
- 維護視圖狀態
- 實現屬性或集合的change notification
3. Model
- 數據和業務邏輯
- 客戶端領域模型
- 由data entities, business objects, repositories and services構成
- 可以實現屬性或集合的change notification
- 可以實現validation 接口例如 IDataErrorInfo
View和ViewModel主要通過數據綁定和Command/Behavior進行交互,如下圖所示:
一個例子並且附代碼下載(Command未示例)
https://www.codeproject.com/Articles/126171/MVVM-Silverlight-Simplified
有關Model(模型)和DTO的問題
前面說的Model是客戶端的,但實際上Domail Model存在服務器端(靠近數據庫)和那就需要和客戶端搞映射DTO(Data Transfer Ojbect,數據傳輸對象,帶序列化標記,用來遠程調用)。在Silverlight中有個很方便的東西來實現這個DTO過程和序列化,那就是WCF RIA Service和DomainService。如果你創建一個簡單的Silverlight應用並且調用WCF RIA Service,基本上會生成DTO Model: ObjectContext(EntityObject)。(也有人喜歡在Model里面調用RiaSerivce實現load,save等等,個人認為不太合適,可以參考這篇文章),此外,參考這篇文章:《WCF RIA Services and a guide to use DTO/”Presentation Model”》
代碼例:
publicpartialclass MyModelsEntities : ObjectContext { … } [EdmEntityTypeAttribute(NamespaceName="MyModels", Name="MyEntity")] [Serializable()] [DataContractAttribute(IsReference=true)] publicpartialclass MyEntity: EntityObject { … }
MVVM的實踐要點
1. View分離要徹底,不要有壞味道
視圖(view)部分,xaml.cs 應該只有很少的代碼或沒有代碼,如果你的xaml.cs包含大量的代碼,那么很可能你MVVM用的不對頭,需要檢查其中代碼的壞味道。Xaml和xaml.cs 只能包含處理界面、視圖、顯示樣式、視圖元素之間的交互、視圖元素動畫,等等的內容。
2. ViewModel要可測試
從重構的觀點看,如果你的代碼中ViewModel是可測試的,有詳細的單元測試Unit Test,你的代碼是OK的,否則需要檢查其中的壞味道。
2.返回頂部 |
3.返回頂部 |
4.返回頂部 |
5.返回頂部 |
6.返回頂部 |
![]() |
作者:ylbtech 出處:http://ylbtech.cnblogs.com/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 |