2011-10-06 74 views
4

我正在使用一個項目中的現有代碼,這個項目裏有豐富的模型(而不是POCO)。基本上,有沒有什麼好的方法來混合豐富的模型和ViewModels而不重複代碼?當您擁有Rich Models時,您會做什麼?


  • 豐富的車型有數據驗證。任何簡單的方法來重用這些ViewModels?

例子:

public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo 
{ 
    private Person _person; 

    [Required] //This seems redundent... 
    public String FirstName { ... } 
} 

public class Person 
{ 
    [Required] 
    public String FirstName { ... } 
} 

這只是其中一個例子......基本上,如果你有豐富的產品型號有什麼辦法來利用這一點,同時保持MVVM,避免redundent代碼?我真的希望避免讓我的模型成爲任何數據上下文或由ViewModel完全公開。

例如:

MVVM的
public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo 
{ 
    private Person _person; 

    //This seems like a bad thing to do... 
    public Person ThePerson { get { return _person; } } 
} 

回答

1

一個想法是表示層數據層中分離出來。這使您可以在不更改數據層的數據的情況下更改表示層所處理的數據。

來自表示層的數據因此只會根據用戶請求寫入您的數據層。您的冗餘FirstName屬性可用作圖層邊框,使您可以靈活地實施類似簡單「撤消所有更改」的操作。

考慮使用通用的ValueViewModel來處理值更改通知,因爲它們是數據綁定所需的。按照這一辦法您的視圖模型看起來像:

public class PersonViewModel : INotifyPropertyChanged, IDataErrorInfo 
{ 
    private Person _person; 

    [Required] //This seems redundent... 
    public ValueViewModel<String> FirstName { ... } 
} 

使用這種模式的模型並不需要實現INotifyPropertyChanged接口什麼再次從數據層分離表示層。

MVVM是一個非常高尚的模式,你會經常看到第一個視圖看起來有點正式的東西,但遵循這個模式給了你很大的靈活性。如果您選擇違反MVVM規則,則會將整個應用程序架構置於危險境地,因爲這一違規行爲會破壞您使用mvvm獲得的靈活性。因此,如果您打算違反MVVM,請考慮不要使用它。

1

我從來沒有看到任何錯誤,從ViewModel公開視圖的整個模型。我知道這不是「MVVM-Purist」方法,但它很簡單,快速,而且效果很好。

但我明白這兩種方法都是同樣有效的,並且通常對於一個非常大的代碼庫來說,Model和ViewModel之間的分隔使得生活更加容易。在那種情況下,爲什麼不讓ViewModel驗證返回ModelValidation?它不如使用DataAnnotations漂亮,但不會在多個位置創建驗證。

例如,我經常使用這樣的事情:

public string GetValidationError(string propertyName) 
{ 
    string s = null; 

    switch (propertyName) 
    { 
     case "FirstName": 
     case "LastName": 
      s = Person.GetValidationError(propertyName); 
      break; 
    } 

    return s; 
} 

string IDataErrorInfo.this[string propertyName] 
{ 
    get { return this.GetValidationError(propertyName); } 
} 
3

這是一個經典的問題什麼的。

如果您使用表示層特定的接口和屬性「污染」了您的Model類,那麼僅通過一個版本的任何邏輯模型即可獲得效率,但會失去演示和業務模型獨立演變的能力。

如果您保持模型「純」並保持獨立的視圖模型,您可以在每個視圖模型中獲得靈活性,但由於必須維護(和映射)兩個版本而失去效率。

從理論的角度來看,對於更復雜的系統,我會推薦後者。如果你的系統相對簡單(可以考慮CRUD),並且你不希望這兩種模型需要獨立演變,那麼前者可能相當安全。

很顯然,這兩種方法並不相互排斥,而是逐個屏幕地做出決定並非聞所未聞。

相關問題