2009-09-16 72 views

回答

71

他們服務於類似的目的(爲應用程序的另一層封裝數據),但他們以不同的方式做了不同的原因。

  • 一個DTO的目的是減少的應用層之間的呼叫的數量,尤其是當這些呼叫是昂貴的(例如,分佈式系統)。 DTO幾乎總是可以序列化的,幾乎從不包含任何行爲。

    例如,您正在開發電子商務網站。 CreateCustomerAddCustomerAddress是數據庫級別的獨立操作,但是出於性能原因,您可能想要將其數據彙總到NewCustomerWithAddressDto,以便您的客戶端只需進行一次往返服務器的操作,而無需關心服務器可能會對數據包做很多不同的事情。

  • 術語「ViewModel」在不同風格的MV *中意味着稍微不同的事物,但其目的主要是分離關注點。您的模型經常針對演示以外的其他目的進行優化,ViewModel負責將視圖與模型的實現細節分離。此外,大多數MV *模式建議儘可能使視圖爲「啞」,因此ViewModel有時會對呈現邏輯負責。

    例如,在同一個電子商務應用程序中,您的CustomerModel在您的「新客戶」視圖中顯示時是錯誤的「形狀」。對於初學者,您的視圖有兩個表單字段供您的用戶輸入並確認其​​密碼,並且您的CustomerModel根本不包含密碼字段!您的NewCustomerViewModel將包含這些字段,並可能根據您的MV *風格,負責某些表示邏輯(例如顯示/隱藏部分視圖)和基本驗證(例如確保兩個密碼字段匹配)。

+0

這是一個很好的解釋!到目前爲止,我所見過的唯一視圖模型只有getter和setter,所以我就是這樣:哇,這很像DTO。感謝您爲我清理這個。 – mkelley33 2009-09-16 11:48:55

11

的目的是不同的:

  • DTO的用於傳輸數據
  • 的ViewModels用於數據顯示給最終用戶。

因此通常ViewModel包含演示數據,巫婆在很多情況下類似於DTO中的內容,但有一些差異。想想枚舉,本地化,貨幣,日期格式的表示形式......。這是因爲在你看來,通常應該沒有邏輯。

10

的DTO在MVVM和MVP通常是非常愚蠢的對象和基本上只是一堆屬性getter和setter方法的。 ViewModels另一方面可能會有一些行爲。

具有DTOs的實際積極影響允許更容易的序列化。如果你有一個相當複雜的對象,比如C#,你會經常發現自己不得不有選擇性地關閉你不想序列化的東西。這可能會變得相當難看,DTO簡化了這個過程。

+3

+1,關鍵的區別在於DTOs是愚蠢的(因此可以簡單地序列化,這是他們的* job *),而ViewModels可以包含否則會進入你的視圖(這是*他們*作業)的邏輯。 – 2009-09-17 08:22:41

+0

@Igor Zevaka你能解釋一下你的行爲是什麼意思嗎? – 2016-03-11 07:53:29

1

視圖模型和數據傳輸對象有相似之處和不同之處。

類似的:在一個記錄 傳輸數據(對象實例,或許串行化)到接收器,是否一個視圖或服務

差異: 視圖模型旨在被髮送到一個瀏覽,在那裏它將顯示格式。 視圖模型也將數據發送回控制器。 DTO通常不適用於演示文稿。它旨在發送原始數據。

相關問題