2009-12-30 13 views
78

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

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

Câu hỏi của tôi: Các đối tượng chuyển dữ liệu và Chế độ xem có giống nhau không? Hoặc là một ViewModel một loại mô hình phụ của một DTO?

+7

Tôi nghĩ có liên quan đến việc 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. –

Trả lời

73

Định nghĩa kinh điển 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.

Chế độ xemMô hình là mô hình của chế độ xem. ViewModels thường là toàn bộ hoặc một phần dữ liệu 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 cụ thể nào cho hành vi của khung nhìn (các phương thức có thể được thực hiện bởi khung nhìn, thuộc tính để chỉ ra cách chuyển đổi các phần tử xem vv ...). Bạn có thể xem mô hình xem như tất cả dữ liệu cho chế độ xem cộng với hành vi. ViewModels có thể hoặc không thể ánh xạ từ một đến một đối tượng kinh doanh hoặc DTO.

Nhân tiện, NHibernate projections có ích nếu một chế độ xem nhất định cần một tập hợp con dữ liệu từ một đối tượng được duy trì.

6

Đố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 độ nhanh (sử dụng DTO, vì tôi đã có) và tính linh hoạt (việc tạo Chế độ xem có nghĩa là phân tách mối quan tâm).

+2

Câu trả lời thực dụng hay. –

27

DTO! = ViewModel

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

+2

vì vậy DTO chỉ có thể là 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)? –

16

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

Thông thường DTO được sử dụng để truyền dữ liệu từ một lớp này sang một lớp khác trên toàn bộ các quy trình khi các cuộc gọi đến dịch vụ từ xa có thể tốn kém nên tất cả dữ liệu cần thiết được đẩy vào DTO và chuyển cho khách hàng trong một đoạn).

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

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

Trong trường hợp đơn giản như đã được tuyên bố DTO này có thể được sử dụng để liên kết với các quan điểm nhưng trong những trường hợp phức tạp hơn nó sẽ đòi hỏi sự sáng tạo của một ViewModel dỡ, sắp xếp dữ liệu từ DTO để ViewModel đó là rõ ràng là làm việc nhiều hơn (khi áp dụng mô hình MVVM).

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

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

46

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

+4

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

+3

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

+4

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

10

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

Thứ hai, 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 của việc sử dụng DTO. Nếu bạn làm như vậy, sự khác biệt bằng cách sử dụng Mô hình miền hoặc DTO của bạn, độ phức tạp hơn để có được một mô hình chống là gì?

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ó á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ĩ rằng nó thậm chí còn tồi tệ hơn nếu bạn có một ViewModel có chứa một DTO, chúng tôi sẽ có cùng một vấn đề.

Từ lớp 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 xem là lạ đối với ứng dụng của mình và không có bất kỳ quyền kiểm soát nào (ngay cả khi bạn đã sử dụng dịch vụ, các lớp trình bày và dto là của bạn).

Cuối cùng, nếu bạn làm việc tách biệt này, người 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, Chế độ xem và Bộ điều khiển không phải lo lắng về lớp dịch vụ hoặc triển khai DTO vì anh ấy sẽ tạo ánh xạ khi người khác phát triển xong việc thực hiện ... Thậm chí anh ấy có thể sử dụng công cụ Mocking hoặc chế nhạo thủ công để điền vào lớp trình bày với dữ liệu để kiểm tra.

+0

Tôi vừa cài đặt VS 2012 và xem ở đó MVC 4 Single Page Application. Trong dự án mẫu, các DTO được sử dụng làm tham số cho các phương thức điều khiển (hoặc các hành động) trong WebApi.Nói cách khác, JSON được đăng 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 tới các phương thức. Bạn có nghĩ rằng việc sử dụng DTO trong trường hợp này là sai. ViewModels có nên được sử dụng với API Web không? Tôi yêu cầu hiểu rõ hơn, bởi vì tôi vẫn chưa quen với những khái niệm này. –

+0

Salut Jean-François Beauchamp :) ASP.NET MVC có thể phân tích cú pháp url vào một đối tượng, ví dụ: giả sử tôi có ánh xạ này đến phương pháp chỉ mục ajax/index/{jobID}/{ResultToSkip}/{ResultToSend} " thay vì có trong chỉ mục controlle (int jobID, int ResultToSkip, int ResultsToSend) Tôi sẽ có chỉ mục (yêu cầu) (yêu cầu là một đối tượng đóng gói 3 trường jobID ...) Vì vậy, bây giờ thay vì params bạn đang nói chuyện với appication của bạn với các đối tượng đóng gói DATA, vì vậy vâng, chúng tôi 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 phải là phương thức giao diện api. –

0

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

Sử dụng tốt hơn DTO & chuyển đổi thành chế độ xem.