2014-03-01 122 views
1

從我讀,我明白,我們總是應該傳入一個視圖模型的視圖。但是,有時這個視圖模型與EF模型完全一樣或幾乎相同。它是可以接受的還是有解決這個問題的辦法(重複代碼)?最佳實踐實體框架模型VS的ViewModels

舉例來說,如果我有這樣的EF-型號:

class UserModel 
{ 
    string id {get;set} 
    string name {get;set} 
    string address {get;set} 
    string phone {get;set} 
    string website {get;set} 
} 

視圖模型如何應該是...是這樣的:

class UserViewModel 
{ 
    string name {get;set} 
    string address {get;set} 
    string otherobject {get;set} 
} 

或者這樣:

class UserViewModel 
{ 
    UserModel user; 
    string otherobject {get;set} 
} 

使用選項#1,屬性會重複...而在另一個視圖模式中,它們會再次重複。我將需要重複每個視圖模型上的所有數據註釋。但是,我只發送我需要的屬性。

對於選項#2,什麼是重複的,但我經過了很多,我並不需要的屬性。

的最後一個選項是混合選項#1,根據需要選擇#2 ...但我不喜歡,因爲缺乏一個共同的標準的這個選項。有時,屬性將在視圖模型中定義和數據註解,有時也會在EF模型中定義。

我希望有一個選項#4,我沒有看到...?

謝謝。

+0

只要使用最簡單,最適合該特定情況的東西。爲了簡單和可讀性而努力......如果使代碼更難理解,就沒有任何僵化之處。 –

回答

2

這些類的區別就是你的應用程序如何與交互。 模型ViewModel有不同的觀衆。

模式應該與您的應用程序進行交互,有時候很多人喜歡用這些模型爲實體在EF代碼第一次。他們就是我們所說的域對象。

另一方面,ViewModels應該與您的視圖進行交互。在你的服務層,你用一些數據填充你的ViewModel,你可以從你的控制器訪問它們。

但是,有時這種視圖模型與EF模型完全一樣或幾乎相同。這裏

的關鍵詞是 「有時」。你是對的,對於一個非常簡單的應用程序,你甚至不需要考慮ViewModels,其中你的模型可以在大多數情況下使用。然而,想想一些例子,如你想要顯示的列表最新帖子列表,最新評論,並且我們說一些相關帖子在單個視圖上。你要做什麼?這就是視頻模型出現的地方。您將特定的ViewModel傳遞給您的視圖,其中包含所有必要的數據,帖子,評論和相關帖子。

在大多數情況下,你視圖模型應該從多個建立模式,有時,一個視圖模型porperties模式

+0

我明白爲什麼我需要一個視圖模型。我不太確定......是如何編寫高效的視圖模型。我編輯我的問題更清楚。 – simonauger

1

我知道它已經相當一段時間,因爲類型這個問題被問到。但是,這可能會幫助正在尋找答案的人。

雖然您有與模型​​幾乎相同的ViewModel,但建議使用相同的代碼創建ViewModels。

可能的原因是

  1. 你可能想驗證添加到使用數據註釋特性。 建議不要在您的模型中對 屏幕進行更具體的驗證,這些驗證應該是您的 數據庫結構的反映。

  2. 您的ViewModels將來可能會發生變化。現在可能沒有意義,但是 總是有可能。

如果您擔心映射代碼在大多數情況下看起來很明顯,那麼您可以使用Automapper。

乾杯!