我正在使用NHibernate來堅持我的域對象。 爲了保持簡單,我使用ASP.NET MVC項目作爲我的表示層和我的服務層。DTO = ViewModel?
我想從我的控制器類中返回XML域對象。在閱讀堆棧溢出的一些帖子後,我收集DTOs是要走的路。但是,我也遇到過有關ViewModel的文章。
我的問題:是數據傳輸對象和的ViewModels是一回事嗎?或者是ViewModel是DTO的一種子模式?
我正在使用NHibernate來堅持我的域對象。 爲了保持簡單,我使用ASP.NET MVC項目作爲我的表示層和我的服務層。DTO = ViewModel?
我想從我的控制器類中返回XML域對象。在閱讀堆棧溢出的一些帖子後,我收集DTOs是要走的路。但是,我也遇到過有關ViewModel的文章。
我的問題:是數據傳輸對象和的ViewModels是一回事嗎?或者是ViewModel是DTO的一種子模式?
一個DTO的規範定義爲對象的,沒有任何行爲的數據形狀。
ViewModels是視圖的模型。 ViewModel通常是來自一個或多個對象(或DTO)的完整或部分數據,以及特定於視圖行爲的任何附加成員(可由視圖執行的方法,指示如何切換視圖元素等的屬性)。您可以將視圖模型視爲視圖的所有數據以及行爲。 ViewModels可能會或可能不會將一對一映射到業務對象或DTO。
順便說一句,NHibernate的projections派上用場,如果某個視圖模型需要從持久對象中的數據的一個子集。
對於一些簡單的看法,我會用我的DTO像我的模特,但隨着瀏覽變得更加複雜,我會創造的ViewModels。
對我來說,(使用DTO,因爲我已經有「時間)和靈活性(創建的ViewModels意味着更多的關注分離)速度之間的平衡。
不錯的務實答案。 – 2016-02-17 06:16:13
DTO - 數據傳輸對象與傳輸數據的容器完全相同。他們沒有任何行爲,只有一大批制定者和獲得者。有些人讓他們不可變,只是在需要時創建新的,而不是更新現有的。它們應該是可序列化的,以允許通過線路傳輸。
通常DTO用於跨越進程邊界將數據從一層發送到另一層,因爲對遠程服務的調用可能很昂貴,因此所有需要的數據都被推送到DTO並以一個塊傳送到客戶端(粗粒度)。
然而,一些人使用的屏幕束縛的DTO的概念(無關交叉過程boundries)。再次,這些填充所需的數據(通常是特定屏幕所需的數據,可能是來自各種來源的數據的聚合)併發送給客戶端。
http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx
在簡單情況下如已經陳述了此DTO可以用於結合圖,但在更復雜的情況下,它需要一個ViewModel的創建和從DTO數據卸載到視圖模型是顯然更多的工作(當應用MVVM模式時)。
如此反覆如前所述DTO!=視圖模型
和
DTO和視圖模型有不同的人生目的
視圖模型在ASP.NET MVC的做法是一樣的DTO,但MVVM模式中的ViewModel與DTO不同,因爲MVVM中的ViewModel具有行爲但DTO沒有。
首先,主要區別在於ViewModel可以具有DTO必須不行的行爲或方法!第二,在ASP.NET MVC中使用DTO作爲ViewModel使得您的應用程序與DTO緊密結合,這正是使用DTO的相反目的。如果你這樣做,使用你的領域Model或DTO有什麼區別,獲得反模式更復雜?
ASP.NET中的ViewModel也可以使用DataAnnotations進行驗證。
相同的DTO可以具有不同的ViewModels映射,並且一個ViewModel可以由不同的DTO組成(始終不包含對象映射)。因爲我認爲如果你有一個包含DTO的ViewModel會更糟,我們會遇到同樣的問題。
從你的表現層看,DTO是一個契約,你將會得到一個對象,你必須認爲它對你的應用程序陌生,並且對它沒有任何控制(即使你有這個服務, dto和表示層是你的)。
最後如果你這樣乾淨的分離,開發人員可以輕鬆地一起工作。 設計ViewModels,Views和Controllers的人不必擔心服務層或DTO的實現,因爲他會在其他開發人員完成實現時進行映射......他甚至可以使用Mocking工具或手動模擬用表示層填充測試數據。
我剛剛安裝了VS 2012,看了看那裏的MVC 4單頁面應用程序。在示例項目中,DTO用作WebApi中控制器方法(或操作)的參數。換句話說,JSON被髮布到這些方法中,並且有一些MVC魔術,數據在被傳遞給方法之前會自動轉換爲DTO。你認爲在這種情況下使用DTO是不對的。 ViewModels應該與Web API一起使用嗎?我要求更好地理解,因爲我對這些概念並不熟悉。 – 2013-03-07 20:31:14
Salut讓 - 弗朗索瓦Beauchamp :) ASP.NET MVC可以解析url的對象,例如: 假設我有這種映射到索引方法ajax/index/{jobID}/{ResultsToSkip}/{ResultsToSend}「 而不是在控制索引(int jobID,int ResultsToSkip,int ResultsToSend) 我將有索引(請求)(請求是封裝3字段jobID的對象...) 因此,現在,而不是你正在談論的params你的應用與封裝DATA的對象,所以是的,我們可以說requestDTO。 例如,你必須添加一個其他字段,你只改變DTO,而不是API接口方法。 – 2013-03-08 11:03:14
如果您將使用DTO作爲ViewModel,這意味着您正在DTO上高調,因爲某些原因您正在更改DTO,那麼它可能會影響ViewModel。
更好地使用DTO &轉換成視圖模型。
我認爲有必要提一下,ASP.NET MVC中的ViewModel與WPF中的ViewModel(MVVM)不是100%等價的,因爲大多數答案都提到了MVVM,並且您正在使用ASP.NET MVC。 – 2011-04-08 08:15:57