2012-06-28 29 views
10

Trong một ứng dụng Java EE hoàn chỉnh được nhóm lại là mẫu DTO vẫn là một lựa chọn hợp lệ? Các ứng dụng trong câu hỏi sử dụng EJBs Hibernate và Struts với mùa xuân vv Có điều gì sai trái khi chuyển các đối tượng miền trong một kịch bản như vậy không?Mẫu DTO có được chấp nhận hay không?

EDIT: Chỉ cần làm rõ câu hỏi của tôi, với các nguồn tài nguyên hiện đại và cải tiến trong Java EE là có một lý do không chỉ sử dụng các đối tượng miền? Nếu không có thì mẫu DTO không bị mờ dần và không nên sử dụng trong các ứng dụng mới?

Trả lời

19

Không được dùng nữa. Nó phụ thuộc vào kiến ​​trúc ứng dụng nếu mẫu DTO nên được sử dụng hay không. Ví dụ, khi bạn phát triển các dịch vụ Web (sử dụng JAX-WS hoặc JAX-RS), bạn nên gửi DTO qua các phương thức web của bạn để ứng dụng khách C# hoặc Python có thể sử dụng nó và phương thức web của bạn không trả về một đối tượng mà lớp đó có Chú thích Hibernate, hãy nhớ hơn các ngôn ngữ khác, Entity sẽ không được tạo ra với những chú thích hoặc logic kinh doanh khác bên trong.


EDIT (Dựa trên nhận xét của bạn): Điều đó tùy thuộc vào kiến ​​trúc phần mềm. Ví dụ, tôi đang làm việc trên một dự án SOA và chúng tôi sử dụng DTO cho Lớp dịch vụ và Lớp trình bày. Bên trong sâu hơn, chúng tôi sử dụng DTO để xử lý giao tiếp cơ sở dữ liệu bên trong dịch vụ, chúng tôi chỉ sử dụng SP để giao tiếp với DB, vì vậy không có Hibernate hoặc bất kỳ công cụ ORM nào khác có thể làm việc ở đó, chúng tôi có thể sử dụng Spring DAO và khuôn khổ đó cũng sử dụng DTO. Bạn có thể tìm thấy rất nhiều mẫu DTO trong nhiều ứng dụng hiện nay.

Thông tin thêm đó sẽ là tuyệt vời cho câu hỏi này:

EDIT 2: Một nguồn thông tin rằng sẽ giải thích lý do chính cho việc sử dụng thiết kế DTO của, giải thích bằng Martin Fowler

Kết luận: DTO của không phải là một chống mẫu. DTO có nghĩa là để được sử dụng chỉ khi bạn cần phải vượt qua dữ liệu từ một hệ thống con khác và họ không có một cách mặc định hoặc standar để giao tiếp.

+0

Có trong kịch bản như vậy, tôi hiểu việc sử dụng của DTO. Bạn đang gửi kết quả trong một DTO. Nhưng đối với việc sử dụng ứng dụng nội bộ, DTO không có nhiều quyền sử dụng? – Thihara

+0

@Thihara trả lời chỉnh sửa dựa trên nhận xét của bạn –

+0

Theo đầu tiên của bạn như nó là một mô hình chống được sử dụng để có được xung quanh thực tế là thực thể đậu không được serializable. Với ORM, vấn đề chính không tồn tại. – Thihara

1

Mẫu là thiết kế tinh khiết. Không có "sự phản đối" của mẫu, nhưng ít sử dụng hơn theo thời gian (hoặc sử dụng quá mức).
Cá nhân, tôi không thấy lý do tại sao không sử dụng DTO.
Ví dụ - tại oVirt dự án mã nguồn mở, chúng tôi có các thực thể đại diện cho các thực thể logic nghiệp vụ trong miền Ảo hóa.
Những thực thể này nên được chú thích bởi chú thích Hibernate (thực ra, chúng là ngày hôm nay, khi chúng ta bắt đầu làm việc trên POCs ngủ đông) và phục vụ như DTOs, và sau đó xóa sạch chú thích đối tượng sẽ ánh xạ tới chúng (giả sử, sử dụng dozer khuôn khổ) và được sử dụng bởi khách hàng
(Tôi không thích có mã phía máy khách với chú thích không cần thiết) hoặc các thực thể phải là đối tượng khách hàng (đối tượng giá trị) được truyền cho khách hàng và chúng ta nên có các lớp khác Các đối tượng DTO

Dấu trừ trong phương pháp trên là bạn có thể có 2 sơ đồ lớp song song - một cho DTO và một cho đối tượng giá trị (được sử dụng bởi máy khách) - nhưng, trong nhiều trường hợp trong thiết kế, có một giao dịch- tắt.
Bạn phải hiểu những ưu điểm và nhược điểm và chọn những gì tốt nhất cho bạn (Trong trường hợp của chúng tôi, vì phía máy khách là GWT, sẽ dễ dàng hơn cho chúng tôi để phân tách thành hai phân cấp lớp, một là phía DTO/phía máy chủ và cũng có thể được chú thích với nhiều chú thích chỉ ở phía máy chủ và chú thích khác được gửi tới mã máy khách GWT).

+0

Giao diện người dùng không phải là GWT mà tôi ngụ ý điều đó ở đâu? Đó là JSP với rất nhiều javascript và jQuery. Có zaske những gì tôi hỏi là liệu có một điểm trong việc sử dụng chúng kể từ các mô hình đối tượng ngày hiện đại là những gì đang nắm giữ dữ liệu. – Thihara

2

Đây là một mẫu rất hữu ích trong Java EE.

Tôi sử dụng DTO để chuyển các đối tượng thực thể liên quan từ đậu EJB sang lớp giao diện người dùng. Các đối tượng thực thể được lấy từ DB trong một giao dịch (xem TransactionAttributeType.REQUIRED) và được lưu trữ trong đối tượng DTO. DTO được tiêu thụ trong lớp Giao diện người dùng.

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