.NET的MVVM框架
Model-View-ViewModel?是一種架構(gòu)模式,主要在 WPF、Silverlight 和 WP7 開發(fā)里使用,它的目標(biāo)是從視圖層移除幾乎所有代碼隱藏(code-behind)。交互設(shè)計(jì)師可以專注于使用 XAML 表達(dá)用戶體驗(yàn)需求,然后創(chuàng)建和視圖模型的綁定,而視圖模型則是由應(yīng)用程序開發(fā)者開發(fā)和維護(hù)的。
MVVM 是更加通用的?Presentation?模式的一個(gè)具體實(shí)現(xiàn)。MVVM 視圖模型包含概念模型而不是數(shù)據(jù)模型,所有業(yè)務(wù)邏輯和其它操作都是在模型和視圖模型里完成的。有很多框架可以做到這點(diǎn),其中一些是:
開源的
- PRISM:由微軟提供,和 MEF/Unity 一起用于依賴注入,支持組合命令,可以擴(kuò)展。MSDN?上有詳細(xì)的教程和演練。?
- MVVM Light Toolkit:有 visual Studio 和 Expression Blend 的項(xiàng)目和項(xiàng)的模板。更多信息請(qǐng)看這里,另外可以參考?VS?和?Expression Blend?的使用教程。
- Caliburn Micro:支持視圖模型先行(ViewModel-First)和視圖先行(View-First)兩種開發(fā)方式,通過(guò) co-routine 支持異步編程。
- Simple MVVM Toolkit:提供 VS 項(xiàng)目和項(xiàng)的模板,依賴注入,支持深拷貝以及模型和視圖模型之間的屬性關(guān)聯(lián)。
- Catel:包含項(xiàng)目和項(xiàng)的模板,用戶控件和企業(yè)類庫(kù)。支持動(dòng)態(tài)視圖模型注入,視圖模型的延遲加載和驗(yàn)證。還支持 WP7 專用的視圖模型服務(wù)。
閉源的
- Intersoft?ClientUI:付費(fèi)的,只支持 WPF 和 Silverlight,但是,除了 MVVM 框架,它還提供其它一些特性。
- Vidyano:免費(fèi)但不開源。帶有實(shí)體映射/虛擬持久化對(duì)象(數(shù)據(jù)容器),業(yè)務(wù)規(guī)則以及內(nèi)置基于 ACL 的安全特性。
若想了解 MVVM,可以參考以下資料:
- Laurent Bugnion 的《Understanding MVVM Pattern》和《Deep Dive MVVM》
- 微軟 Silverlight 組的《Understanding the MVVM Pattern in Silverlight Applications》
- Erik Lebel 在 InfoQ 上的視頻演講《Presentation Pattern》
使用 MVVM 的最大好處之一是分離關(guān)注點(diǎn),以便用戶體驗(yàn)設(shè)計(jì)師和應(yīng)用程序開發(fā)者可以并行工作。另一方面,相關(guān)的擔(dān)憂包括它對(duì)于 UI 操作比較簡(jiǎn)單的情況有點(diǎn)殺雞用牛刀的感覺,數(shù)據(jù)綁定有點(diǎn)難以調(diào)試,以及大量使用數(shù)據(jù)綁定可能帶來(lái)性能問(wèn)題等等。
Jonathan Allen 在評(píng)論里提到幾點(diǎn)錯(cuò)誤使用 MVVM 的征兆:
1. 你的模型和視圖模型名字相同。
視圖模型不應(yīng)該是對(duì)模型的包裝。視圖模型的職責(zé)是外部服務(wù)的請(qǐng)求中介,比如加載和保存數(shù)據(jù)。而數(shù)據(jù)本身,以及驗(yàn)證和大多數(shù)業(yè)務(wù)邏輯應(yīng)該放在模型里。
我經(jīng)常強(qiáng)調(diào)這點(diǎn)。每當(dāng)你創(chuàng)建一個(gè)視圖模型包裝一個(gè)模型,你就在你的 API 里引入一個(gè)巨大漏洞。具體地,任何直接引用這個(gè)模型的東西都可能以視圖模型無(wú)法察覺的方式改變某個(gè)屬性,因此 UI 也不會(huì)有相應(yīng)的改變。同樣地,模型里計(jì)算字段的任何更改也不會(huì)回傳給視圖模型。
2. 你的視圖和視圖模型名字相同。
理想的情況下,視圖模型是不知道使用它們的視圖的,尤其是 WPF 應(yīng)用程序有多個(gè)窗口共享相同的視圖模型。
對(duì)于比較小型的應(yīng)用程序來(lái)說(shuō),整個(gè)應(yīng)用程序可能只需一個(gè)視圖模型。對(duì)于比較大型的應(yīng)用程序來(lái)說(shuō),主要功能可能需要一個(gè)視圖模型,每個(gè)次要方面也需要一個(gè),比如配置管理。
3. 你沒(méi)有代碼隱藏。
代碼隱藏既非一個(gè)好的東西,亦非一個(gè)壞的東西。它只是一個(gè)用來(lái)放置和視圖或控件相關(guān)的邏輯的地方。因此,當(dāng)我看到一個(gè)視圖沒(méi)有任何代碼隱藏,我就會(huì)馬上檢查是否存在以下問(wèn)題:
- 視圖模型是否通過(guò)名字接觸了特定的控件?
- 視圖模型是否通過(guò)命令參數(shù)訪問(wèn)控件?
- 是否使用了 EventToCommand 或其它可以導(dǎo)致泄露的行為而不是簡(jiǎn)單的事件處理程序?
MVVM Light 的 EventToCommand 很有問(wèn)題,因?yàn)樗鼤?huì)使得控件從屏幕移除之后無(wú)法被垃圾回收。
4. 視圖模型監(jiān)聽屬性更改通知
如果一個(gè)模型的的生命周期比監(jiān)聽它的事件的視圖模型長(zhǎng),那么可能導(dǎo)致內(nèi)存泄露。不同于視圖有個(gè) Unloaded 事件,視圖模型對(duì)于生命周期管理沒(méi)有很好的方案。因此如果它們關(guān)聯(lián)到存活期比它們更長(zhǎng)的視圖模型的事件,視圖模型將會(huì)出現(xiàn)泄露。
查看英文原文:MVVM Frameworks For .NET
總結(jié)
以上是生活随笔為你收集整理的.NET的MVVM框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一类存款再遭强监管,规模和收益率都有可能
- 下一篇: TPL 和传统 .NET Framewo