Điểm của việc sử dụng DTO (Đối tượng truyền dữ liệu) là gì?


132

Điểm của việc sử dụng DTO là gì và nó có phải là một khái niệm lỗi thời không? Tôi sử dụng POJO trong lớp xem để truyền và duy trì dữ liệu. Những POJO này có thể được coi là một thay thế cho DTO không?


10
Nhưng POJO có thể là DTO và DTO có thể được thực hiện với POJO. Bạn đang so sánh táo và cam.
Euphoric

3
Tại sao những ý tưởng tốt nên trở nên lỗi thời? Nhìn vào Lisp. Ngoài những câu chuyện cười, tôi đồng ý với Euphoric: Tôi thường triển khai DTO bằng POJO. Tôi vẫn thấy DTO rất đơn giản (KISS) và khái niệm hữu ích.
Giorgio

Không có điểm nào, đó là một mô hình chống, xem: Đối tượng truyền dữ liệu là một sự xấu hổ
yegor256 18/07/16

Câu trả lời:


115

DTO là một mẫu và nó được triển khai (POJO / POCO) độc lập. DTO cho biết, vì mỗi cuộc gọi đến bất kỳ giao diện từ xa nào đều đắt tiền, phản hồi cho mỗi cuộc gọi sẽ mang lại càng nhiều dữ liệu càng tốt. Vì vậy, nếu nhiều yêu cầu được yêu cầu mang dữ liệu cho một nhiệm vụ cụ thể, dữ liệu sẽ được mang theo có thể được kết hợp trong DTO để chỉ một yêu cầu có thể mang lại tất cả dữ liệu cần thiết. Danh mục mô hình kiến ​​trúc ứng dụng doanh nghiệp có nhiều chi tiết hơn.

DTO là một khái niệm cơ bản, không lỗi thời.


9
bạn có thể tìm thấy chúng dưới những cái tên khác nhau, vì dường như mọi người đang phát minh lại bánh xe trong những ngày này
linkerro

3
Giống như "Đối tượng giá trị".
theD

2
@linkerro: Đúng: Tôi nghĩ rằng nhiều người nên dành nhiều thời gian hơn để đọc về những thứ đã được phát minh thay vì tự phát minh lại nó. Công cụ phát minh lại sẽ luôn luôn kém trưởng thành.
Giorgio

10
@Giorgio Có rất nhiều nhà phát triển ngoài kia vẫn đang chạy với những ý tưởng đáng lẽ không bao giờ được thực hiện. Tôi muốn nhiều nhà phát triển đặt câu hỏi cho mọi ý tưởng mà họ đọc.
Erik Reppen

59

DTO là một khái niệm (các đối tượng có mục đích thu thập dữ liệu được máy chủ trả về máy khách) chắc chắn không bị lỗi thời.

Có gì hơi lạc hậu là khái niệm của việc có DTOs chứa không logic chút nào, được sử dụng chỉ để truyền dữ liệu và "ánh xạ" từ đối tượng miền trước khi truyền cho khách hàng, và có ánh xạ tới xem mô hình trước khi chuyển chúng đến lớp hiển thị. Trong các ứng dụng đơn giản, các đối tượng miền thường có thể được sử dụng lại trực tiếp dưới dạng DTO và được truyền trực tiếp đến lớp hiển thị, do đó chỉ có một mô hình dữ liệu thống nhất. Đối với các ứng dụng phức tạp hơn, bạn không muốn hiển thị toàn bộ mô hình miền cho máy khách, do đó, việc ánh xạ từ các mô hình miền sang DTO là cần thiết. Có một mô hình khung nhìn riêng biệt sao chép dữ liệu từ các DTO gần như không bao giờ có ý nghĩa.

Tuy nhiên, lý do tại sao khái niệm này đã lỗi thời thay vì sai lầm đơn giản là một số khung / công nghệ (chủ yếu cũ hơn) yêu cầu nó, vì các mô hình miền và chế độ xem của chúng không phải là POJOS và thay vào đó gắn trực tiếp với khung.

Đáng chú ý nhất là Đậu thực thể trong J2EE trước tiêu chuẩn EJB 3 không phải là POJO và thay vào đó là các đối tượng proxy được xây dựng bởi máy chủ ứng dụng - đơn giản là không thể gửi chúng đến máy khách, vì vậy bạn không có lựa chọn nào về việc tách lớp DTO riêng biệt - đó là bắt buộc.


2
Là một nhà phát triển giao diện người dùng buộc phải có vai trò tổng quát hơn, tôi chắc chắn đã tìm thấy hiện tượng Mapper.Map trong quá trình mã hóa của chúng tôi. Tại sao DTO không thể tự ánh xạ?
Erik Reppen

1
@ErikReppen Lợi ích chính là tách rời các mô hình miền & DTO của bạn. Nếu bản đồ DTO của bạn, nó cần một tham chiếu đến các mô hình miền của bạn.
Alexander Derck

17

Mặc dù DTO không phải là một mẫu lỗi thời, nó thường được áp dụng một cách không cần thiết, điều này có thể làm cho nó có vẻ lỗi thời.

Mẫu bị lạm dụng nhiều nhất trong cộng đồng Java Enterprise là DTO. DTO được xác định rõ ràng là một giải pháp cho một vấn đề phân phối. DTO có nghĩa là một thùng chứa dữ liệu thô, giúp vận chuyển dữ liệu giữa các quy trình (tầng) một cách hiệu quả. ~ Adam Biên

Ví dụ: giả sử bạn có một JSF ManagedBean. Một câu hỏi phổ biến là liệu bean có nên giữ tham chiếu trực tiếp đến Thực thể JPA hay nó nên duy trì tham chiếu đến một số đối tượng trung gian mà sau đó được chuyển đổi thành Thực thể. Tôi đã nghe thấy đối tượng trung gian này được gọi là DTO, nhưng nếu ManagedBeans và Thực thể của bạn đang hoạt động trong cùng một JVM, thì việc sử dụng mẫu DTO sẽ có rất ít lợi ích.

Xem xét các chú thích xác thực Bean. Các thực thể JPA của bạn có thể được chú thích với các xác nhận @NotNull và @Size. Nếu bạn đang sử dụng DTO, bạn sẽ muốn lặp lại các xác nhận này trong DTO của mình để khách hàng sử dụng giao diện từ xa của bạn không cần gửi tin nhắn để biết họ đã thất bại trong việc xác thực cơ bản. Hãy tưởng tượng tất cả công việc bổ sung sao chép chú thích Xác thực Bean giữa DTO và Thực thể của bạn, nhưng nếu Chế độ xem và Thực thể của bạn đang hoạt động trong cùng một JVM, thì không cần phải thực hiện công việc bổ sung này: chỉ cần sử dụng Thực thể.

Liên kết của IAmTheDude với Danh mục mô hình kiến ​​trúc ứng dụng doanh nghiệp cung cấp một lời giải thích ngắn gọn về các DTO và đây là nhiều tài liệu tham khảo mà tôi tìm thấy chiếu sáng:


3
Có câu: "..., nhưng nếu ManagedBeans và Thực thể của bạn đang hoạt động trong cùng một JVM, thì sẽ có rất ít lợi ích khi sử dụng mẫu DTO" . Có rất nhiều ứng dụng cỡ trung bình trong các công ty ngoài kia thực hiện một cách ngu ngốc mẫu DTO mà không có bất kỳ lợi ích nào. Nó chỉ thêm một "lớp sao chép" vô dụng. Những người đã tạo ra các hệ thống này đã không nhận ra trình quản lý thực thể Java EE 5+ tách các thực thể khi giao dịch kết thúc và biến chúng thành các DTO thực tế. Vì vậy, đối với các ứng dụng web JVM đơn, kiểu mẫu đã lỗi thời . Nó dường như là di tích của các nhà phát triển phụ trợ J2EE ...
Kawu

Nhưng "JSF ManagedBean" và "Thực thể JPA" là gì? Nếu chúng không lỗi thời, thì bạn có thể giải thích chúng bằng các thuật ngữ bất khả tri về ngôn ngữ và khuôn khổ.
U Avalos

8

Tuyệt đối không! Gần đây tôi đã học được những bài học về việc sử dụng DTO tốt hơn là đối tượng kinh doanh mà bạn sử dụng (có thể bị ràng buộc với trình ánh xạ ORM của bạn).

Tuy nhiên, chỉ sử dụng chúng khi chúng phù hợp để sử dụng và không chỉ vì mục đích sử dụng vì chúng được đề cập trong một số cuốn sách mẫu hay.
Một ví dụ điển hình xuất hiện trong đầu tôi là khi bạn tiếp xúc với một số loại giao diện cho bên thứ 3. Trong trường hợp như vậy, bạn muốn giữ các đối tượng trao đổi khá ổn định mà bạn thường có thể đạt được độc đáo với DTOs.


1

Một nơi tôi thấy các DTO đặc biệt hữu ích là trong việc chứa logic cho các phản hồi API. Với mẫu này, thật dễ dàng để quản lý các loại phản hồi khác nhau từ các đối tượng đến các định dạng khác nhau theo cách có thể kiểm tra được. Sử dụng mẫu này với vai trò hiện tại của mình, chúng tôi đã có thể bắt đầu thử nghiệm các định dạng phản hồi cho các API của chúng tôi, điều này rất có giá trị vì ngăn xếp của chúng tôi trở nên đồng hình hơn với các máy khách khác nhau (http / mobile). Chắc chắn không lỗi thời.

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.