2013-05-22 30 views
0

我最近閱讀了關於ViewModel及其優點。我能夠理解爲什麼它是必要的,但是我的問題是如果我有兩個類爲同一個對象(即人類),我不使代碼冗餘?此外,它不會使未來的更改有點困難,因爲您需要確保基類模型和視圖模型具有相同數量的屬性是正確的?例如,讓我們說,我有一個名爲Person表具有ViewModel Redundancy Clarification

  1. ID
  2. 名稱
  3. 顏色

我創建用於創建NHibernate的映射一個HBM。我有以下的模型類

public class Person { 

public int ID {get;set;} 
public string Name {get;set;} 
public string color {get;set;} } 

如果我是正確的,視圖模型類應該看起來像

public class PersonViewModel { 

[DisplayName("Full Name")] 
public string Name {get;set;} 
[DisplayName("Favourite Color")] 
public string color {get;set;} 
} 

首先,我有兩個類新指在數據庫中同一個對象。即使一個類用於數據庫目的,另一個類用於查看目的,我們仍然有兩個具有完全相同元數據的類。其次,如果我在數據庫中引入一個新字段,我需要將它添加到三個位置,即基本模型類,視圖模型類和HBM文件。

如果我錯了,請糾正我,這怎麼可以被稱爲代碼優化或最佳實踐。

回答

1

這取決於您希望採用的方法,您可以直接將模型作爲視圖模型的屬性公開,以避免違反DRY原則。但是,這會違反Demeter法律,因此您必須平衡這一點,因爲您的觀點現在將與您的域模型更緊密地結合在一起。

另外,就驗證而言,如果直接暴露模型,那麼即使您不直接在視圖中使用該屬性,您也需要小心即使最終用戶可以設置任何暴露的屬性。您也更有可能對每個視圖有不同的驗證要求,在這種情況下,驗證將成爲視圖模型的關注點。

這就是爲什麼一般的最佳做法是不要將您的域模型直接暴露給視圖。您可以使用框架(如AutoMapper)來減少圖層之間的數據傳輸管道代碼。

+0

所以你說它最好的每個對象都是它應該做的。基本模型類應該綁定到數據庫。視圖模型綁定到基礎模型類,但具有所有的驗證。有沒有辦法IDE可以提醒我View Model中新增的屬性在基本模型中不存在,反之亦然? – vikramjb

+0

我不確定你的術語,基類表明繼承在這裏不合適。就通知而言,問題在於模型和視圖模型之間存在阻抗不匹配,因爲它們不是建模相同的東西。您的視圖模型可能會增加視圖所需的其他屬性的模型形狀。您也可能不希望或需要將您的所有模型屬性公開給您的視圖,因此任何自動通知其差異都不適合。 – devdigital

+0

「,所以任何自動通知他們的差異將不適合」我不得不不同意這種說法。但我同意你給出的全面答案。謝謝你的澄清,感謝你。 – vikramjb