2009-09-16 29 views

Trả lời

71

Chúng phục vụ một mục đích tương tự (đóng gói dữ liệu cho một lớp ứng dụng khác) nhưng chúng thực hiện khác và vì các lý do khác nhau.

  • Mục đích của một DTO là để giảm số lượng các cuộc gọi giữa các tầng của một ứng dụng, đặc biệt là khi những cuộc gọi rất tốn kém (hệ thống phân phối ví dụ). DTO hầu như luôn luôn có thể tuần tự hóa được, và hầu như không bao giờ chứa bất kỳ hành vi nào.

    Ví dụ: bạn đang phát triển một trang web thương mại điện tử. CreateCustomerAddCustomerAddress là các hoạt động riêng biệt ở cấp cơ sở dữ liệu, nhưng bạn có thể vì lý do hiệu suất muốn tổng hợp dữ liệu của chúng thành NewCustomerWithAddressDto để khách hàng của bạn chỉ cần thực hiện một chuyến đi khứ hồi tới máy chủ và không cần phải quan tâm máy chủ có thể đang thực hiện một loạt các thứ khác nhau với lô dữ liệu.

  • Thuật ngữ "ViewModel" có nghĩa là hơi khác nhau về các hương vị khác nhau của MV *, nhưng mục đích của nó chủ yếu là tách mối quan tâm. Mô hình của bạn thường được tối ưu hóa cho một số mục đích khác ngoài bản trình bày và đó là trách nhiệm của ViewModel để tách Chế độ xem của bạn khỏi các chi tiết triển khai của Mô hình. Ngoài ra, hầu hết các mẫu MV * đều khuyên bạn làm cho Chế độ xem của bạn trở nên "câm" càng tốt và vì vậy ViewModel đôi khi chịu trách nhiệm về logic trình bày.

    Ví dụ: trong cùng một ứng dụng Thương mại điện tử, CustomerModel của bạn sai "hình dạng" cho bản trình bày trên Chế độ xem "Khách hàng mới" của bạn. Đối với người mới bắt đầu, Chế độ xem của bạn có hai trường biểu mẫu để người dùng của bạn nhập và xác nhận mật khẩu của họ và tất cả các số CustomerModel của bạn đều không chứa trường mật khẩu! NewCustomerViewModel của bạn sẽ chứa các trường đó và có thể, tùy thuộc vào hương vị của MV *, chịu trách nhiệm về một số logic trình bày (ví dụ: hiển thị/ẩn các phần của chế độ xem) và xác thực cơ bản (ví dụ: đảm bảo cả hai trường mật khẩu khớp nhau).

+0

Đó là một lời giải thích tuyệt vời! Cho đến bây giờ các mô hình xem duy nhất tôi đã thấy chỉ có getters và setters vì vậy tôi đã thích: wow đó là rất nhiều như một DTO. Cảm ơn bạn đã thanh toán bù trừ cho tôi. – mkelley33

11

Mục đích là khác nhau:

  • DTO của được sử dụng để truyền dữ liệu
  • ViewModels được sử dụng để hiển thị dữ liệu để người dùng cuối.

Vì vậy, Chế độ xem thông thường chứa dữ liệu trình bày, phù thủy có nhiều trường hợp tương tự như trong DTO nhưng có một số khác biệt. Hãy suy nghĩ về đại diện của enums, nội địa hóa, tiền tệ, định dạng ngày, .... Điều này là bởi vì thông thường không nên có logic trong quan điểm của bạn.

10

DTOs trong MVVM và MVP thường Objects Rất Dumb và về cơ bản chỉ là một loạt các setters tài sản và thu khí. ViewModels mặt khác có thể có một số hành vi.

Tác dụng phụ tích cực thực tế của việc có DTO là cho phép tuần tự hóa dễ dàng hơn. Nếu bạn có một đối tượng khá phức tạp trong, nói C#, bạn sẽ thường thấy mình phải chọn lọc những thứ mà bạn không muốn serialized. Điều này có thể nhận được khá xấu xí và DTO đơn giản hóa quá trình này.

+3

+1, điểm khác biệt chính là DTO là ngu ngốc (và do đó có thể nối tiếp trivially, đó là công việc * của họ), và ViewModels có thể chứa logic mà nếu không thì bạn có thể xem được (đó là * công việc của họ). –

+0

@Igor Zevaka Bạn có thể giải thích ý nghĩa của hành vi không? –

1

Đối tượng xem và đối tượng chuyển dữ liệu có điểm tương đồng và khác biệt.

tương tự: Truyền dữ liệu trong một bản ghi (trường hợp đối tượng, có lẽ serialized) đến người nhận, cho dù một cái nhìn hay một dịch vụ

khác biệt: Một Xem các mẫu được thiết kế để được gửi đến một View, nơi nó sẽ được hiển thị, với định dạng. Mô hình xem cũng gửi dữ liệu trở lại bộ điều khiển. Một DTO thường không được dùng để trình bày. Nó được thiết kế để gửi dữ liệu thô.

Các vấn đề liên quan