dto là gì?
dto hoặc tên đầy đủ data tranfer object là một mẫu thiết kế được Martin Fowler giới thiệu lần đầu trong cuốn sách ea. Mục đích chính của dto là giảm số lần gọi phương thức giữa các quy trình.
Giảm các lệnh gọi phương thức giữa các quy trình? Bạn có thấy khó hiểu không? Tôi đã bối rối khi lần đầu tiên đọc về khái niệm này, nhưng hãy xem kịch bản dưới đây.
Giả sử chúng ta đang phát triển một ứng dụng web giao diện người dùng cần hoạt động với hệ thống api phần còn lại phụ trợ. Mỗi lần gọi api xử lý dữ liệu và lấy kết quả sẽ rất mất thời gian nên chúng ta cần giảm thiểu số lần gọi api và làm sao để mỗi lần gọi xử lý được nhiều vấn đề hơn. Muốn vậy, api lúc này cần tiếp nhận thêm các tham số (parameter) đầu vào để xử lý nhiều công việc cùng lúc.
Nếu như trước đây chỉ xử lý 1 công việc a thì api chỉ cần nhận 2 tham số x1, x2 thì nay cần xử lý thêm công việc b thì cần 4 tham số x1, x2, x3, x4. Sử dụng quá nhiều tham số đầu vào có thể gây khó khăn cho việc lập trình cả front-end và back-end. Ngoài ra, API hiện phải trả tiền cho nhiều kiểu dữ liệu hơn cho một yêu cầu, điều này rất khó đối với Java vì nó chỉ cho phép trả về một đối tượng của một loại cụ thể.
Giải pháp ở đây là khởi tạo một đối tượng dto với tất cả dữ liệu trong một lần gọi api. Nó cần phải được tuần tự hóa trước khi truyền qua kết nối và có thể giải tuần tự hóa để lấy lại dto ban đầu được gửi từ đầu bên kia.
Mô hình miền và dto
Chúng ta cần phân biệt giữa mô hình miền và dtos để tránh nhầm lẫn. Mô hình miền là một lớp thực thể được sử dụng để ánh xạ các bảng trong cơ sở dữ liệu và dto là một đối tượng kết hợp nhiều tham số thành một tập hợp trong một lớp dto.
Làm thế nào để sử dụng dto?
dto là cấu trúc dữ liệu phẳng không chứa logic nghiệp vụ, nó chỉ dùng để lưu trữ dữ liệu, các phương thức cho phép truy cập và sử dụng dữ liệu trong quá trình tuần tự hóa hoặc giải tuần tự hóa. Dữ liệu được ánh xạ từ các mô hình miền sang DTO và ngược lại bởi các thành phần được gọi là trình ánh xạ được đặt trong lớp trình bày hoặc lớp mặt tiền.
Để minh họa cách sử dụng dto rõ ràng hơn, chúng ta sẽ sử dụng spring boot để triển khai một api đơn giản. Xin lưu ý rằng trong phần này, tôi chỉ đưa ra một số mã cần thiết để làm rõ việc sử dụng dto. Để chạy ứng dụng đầy đủ, bạn có thể cuộn xuống cuối bài viết để có liên kết tới mã nguồn đầy đủ.
Mô hình miền
Đầu tiên chúng ta sẽ định nghĩa 2 lớp miền là User và Role như hình bên dưới
Lưu ý: Người dùng và vai trò có mối quan hệ nhiều-nhiều.
đến lớp
Tiếp theo chúng ta sẽ có 3 class dto là userdto, roledto và usercreationdto. Trong đó userdto và roledto dùng để ánh xạ người dùng và vai trò khi trả dữ liệu về client, còn usercreationdto dùng để thêm người dùng mới, vì để khởi tạo một user, chúng ta không chỉ cần các thông tin cơ bản của nó như tên, mật khẩu mà còn cũng là một danh sách các vai trò được gán cho người dùng.
Người lập bản đồ
Như đã nói, việc chuyển đổi giữa dto và domain model cần có một lớp trung gian, ở đây tôi sử dụng mapper.
Đầu tiên là usermapper, cho phép chuyển đổi usercreationdto thành user và từ user thành userdto.
Tiếp theo là rolemapper, chứa 2 phương thức cơ bản nhất để chuyển đổi giữa tên miền và dtos.
Dịch vụ
Trong phần này, chúng ta sẽ quan tâm đến dịch vụ người dùng được sử dụng để khởi tạo người dùng mới. Ở đây chúng ta cần sử dụng mapper để chuyển đổi dto thành người dùng. Tiếp tục save vào database, và lại dùng mapper convert đối tượng user lưu trong database thành dto và trả về client.
Điều này cho thấy vai trò của dto trong ví dụ này, usercreationdto được sử dụng để đóng gói thông tin cơ bản của người dùng, vai trò được gán cho người dùng và tất cả các thông tin cần thiết.
Bộ điều khiển
Tầng này sẽ nhận yêu cầu của client và chuyển xuống tầng dịch vụ để xử lý, bạn có thể tham khảo
Để chạy thử, bạn cần làm theo các bước sau:
- Khởi tạo một số vai trò, lưu id vai trò trong phản hồi (roleids)
- Khởi tạo người dùng với thông tin cần thiết và id vai trò được lưu ở bước 1
Yêu cầu người dùng mẫu ban đầu như sau
Kết quả là thế này
Tóm tắt
Hy vọng điều này sẽ giúp bạn hiểu rõ hơn về mẫu DTO, tôi tin rằng hầu hết chúng ta sử dụng nó hàng ngày khi tìm hiểu và phát triển các ứng dụng API.
Liên kết nguồn: dto-pattern
Tài liệu tham khảo