DTO = ViewModel?


102

Tôi đang sử dụng NHibernate để duy trì các đối tượng miền của mình. Để đơn giản hóa mọi thứ, tôi đang sử dụng một dự án ASP.NET MVC làm cả lớp trình bày và lớp dịch vụ của tôi.

Tôi muốn trả lại các đối tượng miền của mình trong XML từ các lớp bộ điều khiển của tôi. Sau khi đọc một số bài đăng ở đây trên Stack Overflow, tôi thu thập DTO là cách để thực hiện. Tuy nhiên, tôi cũng đã xem qua các bài đăng nói về ViewModel.

Câu hỏi của tôi: Đối tượng truyền dữ liệu và ViewModels có giống nhau không? Hay ViewModel là một loại mẫu phụ của DTO?


9
Tôi nghĩ có liên quan khi đề cập đến ViewModels trong ASP.NET MVC không tương đương 100% với ViewModels trong WPF (MVVM), vì hầu hết các câu trả lời đều đề cập đến MVVM và bạn đang làm việc với ASP.NET MVC.
Matthijs Wessels

Câu trả lời:


104

Định nghĩa chính tắc của DTO là hình dạng dữ liệu của một đối tượng không có bất kỳ hành vi nào.

ViewModels là mô hình của khung nhìn. ViewModels thường là dữ liệu đầy đủ hoặc một phần từ một hoặc nhiều đối tượng (hoặc DTO) cộng với bất kỳ thành viên bổ sung nào cụ thể cho hành vi của chế độ xem (các phương thức có thể được chế độ xem thực thi, các thuộc tính để chỉ ra cách chuyển đổi các phần tử chế độ xem, v.v.). Bạn có thể xem mô hình xem dưới dạng tất cả dữ liệu cho một chế độ xem cộng với các hành vi. ViewModels có thể hoặc không thể ánh xạ từng cái một tới các đối tượng kinh doanh hoặc DTO.

Nhân tiện, các phép chiếu NHibernate rất hữu ích nếu một mô hình xem nhất định cần một tập hợp con dữ liệu từ một đối tượng cố định.


Bạn có thể giải thích điều này: "DTO là hình dạng dữ liệu của một đối tượng mà không có bất kỳ hành vi nào"?
roozbeh S

2
Có nghĩa là ... lớp DTO thường chỉ chứa các thuộc tính và không chứa bất kỳ phương pháp với logic kinh doanh vv ...
Daniel Auger

71

ViewModel trong ASP.NET MVC thực hành giống với DTO, tuy nhiên ViewModel trong MVVM pattern khác với DTO vì ViewModel trong MVVM có các hành vi nhưng DTO thì không.


4
Đây là một câu trả lời hay; mặc dù ngắn về chi tiết.
Phil

5
Tại sao ViewModel trong asp.net mvc phải giống với DTO? Điều đó không có ý nghĩa. ViewModel có thể có hành vi còn DTO thì không. Điều này không phụ thuộc vào mvc.
Elisabeth

8
+1 để phân biệt giữa ASP.NET MVC ViewModel và MVVM ViewModel.
Ronald

5
@Elisa - Câu trả lời cho câu hỏi khá cũ của bạn là trong ASP.NET MVC, chế độ xem gọi Hành động trên bộ điều khiển (không phải ViewModel) để thay đổi Mô hình và Chế độ xem theo cách không trạng thái. Do đó, DTO được định hình cho một khung nhìn về cơ bản giống với ViewModel. Tuy nhiên, trong các hệ thống lớn hơn có ranh giới tuần tự hóa khác, DTO có thể có lợi nếu tách biệt khỏi ViewModel được định hình cụ thể cho Chế độ xem.
dansan

27

DTO! = ViewModel

Trong mẫu MVVM , ViewModel được sử dụng để tách Model khỏi Chế độ xem. Để biểu diễn Mô hình, bạn có thể sử dụng các lớp DTO đơn giản , lớp này lại được ánh xạ tới cơ sở dữ liệu thông qua ví dụ: NHibernate. Nhưng tôi chưa bao giờ thấy một lớp ViewModel được mô hình hóa như một DTO .. ​​Các lớp ViewModel chủ yếu có hành vi, mà các DTO không có.


2
vậy DTO có thể chỉ là các cấu trúc (hoặc là một lớp nên bắt chước các khả năng của một cấu trúc)?
Max Alexander

20

DTO - Đối tượng truyền dữ liệu chính xác như nó nói, các thùng chứa để truyền dữ liệu. Chúng không có hành vi mà chỉ đơn thuần là một đám người định cư và lập công. Một số người biến chúng thành bất biến và chỉ tạo những cái mới khi cần thay vì cập nhật những cái hiện có. Chúng phải có thể nối tiếp hóa để cho phép truyền qua dây.

Nói chung DTO được sử dụng để chuyển dữ liệu từ lớp này sang lớp khác qua các giới hạn quy trình vì các lệnh gọi đến một dịch vụ từ xa có thể tốn kém vì vậy tất cả dữ liệu được yêu cầu được đẩy vào một DTO và được chuyển đến máy khách trong một đoạn (hạt thô).

Tuy nhiên, một số người sử dụng khái niệm DTO liên kết màn hình (không liên quan gì đến việc vượt qua các giới hạn quy trình). Một lần nữa, những dữ liệu này được điền với dữ liệu bắt buộc (nói chung là dữ liệu cần thiết cho một màn hình cụ thể và có thể là tập hợp dữ liệu từ nhiều nguồn khác nhau) và được gửi đến máy khách.

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

Trong các trường hợp đơn giản như đã nêu, DTO này có thể được sử dụng để liên kết với chế độ xem nhưng trong các trường hợp phức tạp hơn, nó sẽ yêu cầu tạo ViewModel và tải dữ liệu từ DTO sang ViewModel, điều này rõ ràng là nhiều công việc hơn (khi áp dụng mẫu MVVM) .

Vì vậy, một lần nữa như đã nêu DTO! = ViewModel

DTO và ViewModel có những mục đích khác nhau trong cuộc sống


13

Đầu tiên, sự khác biệt chính là ViewModel có thể có hành vi hoặc phương thức mà DTO Không được !!!

Thứ hai, việc sử dụng DTO làm ViewModel trong ASP.NET MVC làm cho ứng dụng của bạn được kết hợp chặt chẽ với DTO và đó chính xác là mục đích ngược lại của việc sử dụng DTO. Nếu bạn làm như vậy, sự khác biệt khi sử dụng Model miền hoặc DTO của bạn, phức tạp hơn để có được một anti-pattern?

Ngoài ra ViewModel trong ASP.NET có thể sử dụng DataAnnotations để xác thực.

Cùng một DTO có thể có các Ánh xạ ViewModels khác nhau và Một ViewModel có thể được tạo từ các DTO khác nhau (luôn luôn có ánh xạ đối tượng không phải là thành phần). bởi vì tôi nghĩ thậm chí còn tệ hơn nếu bạn có ViewModel chứa DTO, chúng ta sẽ gặp vấn đề tương tự.

Từ lớp bản trình bày của bạn, hãy nghĩ về DTO như một hợp đồng, bạn sẽ nhận được một đối tượng mà bạn phải coi là xa lạ với ứng dụng của mình và không có bất kỳ quyền kiểm soát nào đối với nó (ngay cả khi bạn có dịch vụ cũ, lớp dto và lớp trình bày là của bạn à).

Cuối cùng, nếu bạn thực hiện tách biệt rõ ràng này, các nhà phát triển có thể làm việc cùng nhau một cách dễ dàng. Người thiết kế ViewModels, Views và Controllers không phải lo lắng về lớp dịch vụ hoặc việc triển khai DTO bởi vì anh ta sẽ lập bản đồ khi những người phát triển khác hoàn thành việc triển khai của họ ... Anh ta thậm chí có thể sử dụng công cụ Mocking hoặc mô phỏng thủ công để lấp đầy lớp trình bày với dữ liệu để kiểm tra.


1
Tôi vừa cài đặt VS 2012 và xem có Ứng dụng Trang đơn MVC 4. Trong dự án mẫu, DTO được sử dụng làm tham số cho các phương thức bộ điều khiển (hoặc hành động) trong WebApi. Nói cách khác, JSON được đưa lên các phương thức đó và với một số phép thuật MVC, dữ liệu được tự động chuyển đổi thành DTO trước khi được chuyển cho các phương thức. Bạn có nghĩ rằng sử dụng DTO trong trường hợp này là sai. Có nên sử dụng ViewModels với Web API không? Tôi đang hỏi để hiểu rõ hơn, bởi vì tôi vẫn chưa quen thuộc với những khái niệm này.
Jean-François Beauchamp

Salut Jean-François Beauchamp :) ASP.NET MVC có thể phân tích cú pháp url prams thành một đối tượng, ví dụ: giả sử tôi có ánh xạ này đến phương thức Index ajax / index / {jobID} / {ResultsToSkip} / {ResultsToSend} "thay vì có trong controlle Index (int jobID, int resultsToSkip, int resultsToSend) Tôi sẽ có Index (request) (request là một đối tượng đóng gói 3 trường jobID ...) Vì vậy, bây giờ thay vì các tham số, bạn đang nói với appication của mình bằng các đối tượng đóng gói DATA, vì vậy có, chúng ta có thể nói requestDTO. Ví dụ: bạn phải thêm một trường khác, bạn chỉ thay đổi DTO, không thay đổi các phương thức giao diện api.
riadh gomri

9

Đối với một số chế độ xem đơn giản, tôi sẽ sử dụng DTO làm mô hình của mình, nhưng khi Chế độ xem trở nên phức tạp hơn, tôi sẽ tạo ViewModels.

Đối với tôi, đó là sự cân bằng giữa tính nhanh chóng (sử dụng DTO, vì tôi đã có chúng) và tính linh hoạt (tạo ViewModels có nghĩa là tách biệt nhiều mối quan tâm hơn).


2
Câu trả lời thực dụng tốt đẹp.
Simon Tewsi

0

Nếu bạn sử dụng DTO làm ViewModel, điều đó có nghĩa là bạn đang phụ thuộc nhiều vào DTO vì lý do nào đó bạn đang thay đổi DTO thì điều đó có thể ảnh hưởng đến ViewModel.

Sử dụng tốt hơn DTO & chuyển đổi thành mô hình xem.


-1

Chúng ta có thể sử dụng DTOgiống như lớp Model và chúng ta có thể sử dụng viewmodel khi cần hiển thị / sử dụng dữ liệu / thuộc tính nhiều mô hình trong một chế độ xem duy nhất. Ví dụ: Tôi tạo một số mô hình bằng cách sử dụng cơ sở dữ liệu khung thực thể trước. Vì vậy, bây giờ tất cả các mô hình tạo ra dựa trên cơ sở dữ liệu. và bây giờ chúng ta cần chú thích dữ liệu, đối với những chú thích dữ liệu đó, chúng ta có thể tạo tên thư mục DTO, Trong thư mục DTO này, chúng ta có thể giữ chính xác tất cả các mô hình đã tạo và thêm chú thích dữ liệu phía trên thuộc tính. Sau đó, chúng ta có thể sử dụng bất kỳ thao tác nào (sử dụng bộ điều khiển, các khung nhìn) bằng cách sử dụng các lớp DTO này. Và khi chúng ta cần chế độ xem phức tạp, ý tôi là khi chúng ta cần nhiều dữ liệu lớp trong một chế độ xem ở đó chúng ta có thể sử dụng mô hình xem. Đối với viewmodel, chúng ta có thể tạo một viewmodel tên thư mục, sau đó tạo một lớp tùy chỉnh và giữ lại thuộc tính mà chúng ta cần. Tôi đã cố gắng thanh minh. Bất kỳ đề nghị đánh giá cao.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.