2010-08-05 100 views
15

我想開始收集MVVM-light(w/RIA Services)最佳實踐。我發現許多項目都是有用的最佳實踐或最佳方法,但希望聽到其他人使用MVVM-light工具包並查看他們發現的內容。MVVM-light + RIA服務最佳實踐

請將您的最佳做法發佈爲此問題的答案。

+3

考慮將其轉換爲社區wiki,以便任何人都可以編輯。 – 2010-08-05 16:19:37

+0

我不會認爲它是一個com-wiki。提問者應該爲這個好問題贏得聲譽。 – Shimmy 2011-03-24 03:19:40

回答

25

MVVM光強的基本用法

  1. Intialize的DispatcherHelper在App.cs文件的Application_Startup功能
  2. 從BaseClass的創建的ViewModels
  3. 始終創建一個ViewModelLocator類,它包含所有視圖模型並鏈接到您的應用程序資源
  4. 使用RelayCommands將函數公開給您的視圖
  5. 瞭解何時使用DispatchHelper。

清理思路:

  1. 在適當的時候,添加到您的視圖模型以清除清理您的DomainContext的EntitySet的()?
  2. 調用ViewModelLocator的CleanupSVM()函數清除視圖模型,當它們在應用程序中不再需要時。

我很想聽聽其他人關於何時/如何使用CleanUp功能。隨着應用程序的增長,我確實需要添加一些清理功能來更好地管理客戶端內存使用情況。

對於混合能力:

  1. 摘要服務/查詢實現到一個接口。
  2. 創建2個班每個服務實現類(1設計,1用於生產)
  3. 在你的每個視圖模型,實現自己的服務類(使用IsInDesignMode)來創建可摻混服務的實現是必要的。
  4. 使用靜態變量將您的DomainContext保存在Service Implmentation類中。
  5. 在ViewModels的構造函數中添加DispatcherHelper.Initialize(),但僅在設計模式下使用。 Blend在加載頁面時不會加載應用程序,這可以解決這個問題。

爲了增加業務邏輯:

  1. 示範添加業務邏輯,第一,然後在視圖模型。
  2. 使用模型的部分方法爲適當的更改/更新事件添加邏輯。
  3. 添加只讀屬性(只有getter)以在模型上提供摘要值和計算值。

對於查看:

  1. 根始終綁定到定位對象。
  2. 儘量保持代碼隱藏的邏輯佈局或僅自定義UI邏輯。避免引用您的ViewModel。

對於類別:

  1. 使用CollectionViewSource在你的ViewModels收集,與DomainContext的EntitySet的
  2. 源應用所有篩選,排序和分組邏輯到CollectionViewSource在你的視圖模型。
  3. 後ServiceCalls,呼叫.View.Refresh()在您的CollectionViewSource對象爲需要更新UI。

對於視圖模型協調(控制器邏輯)

  1. 使用盡量少的消息,太多的複雜性可能難以管理。
  2. 使用NotificationMessage和PropertyChangedMessage類發送/接收帶。

對於RIA DomainServices:

  1. 實現在持續變化功能的任何記錄,而不是更新/插入/刪除邏輯。
  2. 在插入,更新,刪除等功能,如果你需要通過導航屬性從另一個上下文引用另一個實體,無論是先檢查EntityStatus,或裝入實體,防止EntityStatus衝突。

用於調試/測試:

  1. 檢查輸出窗口進行綁定錯誤並進行修復。綁定錯誤會以靜默方式向用戶失敗,但會降低應用程序性能和預期行爲。
  2. 在Silverlight創建單元測試,以驗證添加任何型號/業務邏輯
  3. 創建單元測試項目來測試服務器端邏輯和功能

對於實體框架:

  1. 保持1-將EntitiesContext與域服務進行1比1的匹配。試圖以另一種方式分裂會導致問題。
  2. 不要使用[組成]屬性,除非你完全打算花了很多時間精心打造你的插入,更新和刪除邏輯。
  3. 使用單獨的服務將自定義類型返回給RIA客戶端。不要在PersistChangeSet功能將它們添加到您的DomainService你的EntityFramework對象
  4. 執行服務器端更新/集成邏輯(例如更新等系統),而不是在插入,更新,刪除等功能。這將防止您無意中通過導航屬性拉入實體,這將導致您的分離版本不更新。
  5. 創建額外的上下文以在更新/集成邏輯期間查找當前值。