TL; DR:
Một DTO mô tả mô hình chuyển giao trạng thái. Một POCO không mô tả bất cứ điều gì. Đó là một cách khác để nói "đối tượng" trong OOP. Nó xuất phát từ POJO (Java), được đặt ra bởi Martin Fowler, người thực sự chỉ mô tả nó như một cái tên lạ hơn cho 'đối tượng' vì 'đối tượng' không gợi cảm lắm.
DTO là một mẫu đối tượng được sử dụng để chuyển trạng thái giữa các lớp quan tâm. Họ có thể có hành vi (nghĩa là về mặt kỹ thuật có thể là một poco) miễn là hành vi đó không làm thay đổi trạng thái. Ví dụ, nó có thể có một phương thức nối tiếp chính nó.
POCO là một đối tượng đơn giản, nhưng 'đơn giản' có nghĩa là nó không đặc biệt. Nó chỉ có nghĩa là nó là một đối tượng CLR không có mô hình ngụ ý cho nó. Một thuật ngữ chung. Nó không được thực hiện để làm việc với một số khung khác. Vì vậy, nếu POCO của bạn có [JsonProperty]
hoặc trang trí EF trên tất cả các thuộc tính của nó, chẳng hạn, thì tôi cho rằng đó không phải là POCO.
Dưới đây là một số ví dụ về các loại mẫu đối tượng khác nhau để so sánh:
- Mô hình xem : được sử dụng để mô hình dữ liệu cho một khung nhìn. Thường có chú thích dữ liệu để hỗ trợ ràng buộc và xác nhận. Trong MVVM, nó cũng hoạt động như một bộ điều khiển. Nó còn hơn cả một DTO
- Đối tượng giá trị : được sử dụng để biểu diễn các giá trị
- Root tổng hợp : được sử dụng để quản lý trạng thái và bất biến
- Trình xử lý : được sử dụng để trả lời một sự kiện / tin nhắn
- Thuộc tính : được sử dụng làm vật trang trí để giải quyết các mối quan tâm xuyên suốt
- Dịch vụ : được sử dụng để thực hiện các nhiệm vụ phức tạp
- Bộ điều khiển : được sử dụng để kiểm soát luồng yêu cầu và phản hồi
- Factory : được sử dụng để cấu hình và / hoặc lắp ráp các đối tượng phức tạp để sử dụng khi hàm tạo không đủ tốt. Cũng được sử dụng để đưa ra quyết định về những đối tượng cần được tạo ra trong thời gian chạy.
- Kho lưu trữ / DAO : được sử dụng để truy cập dữ liệu
Tất cả chỉ là các đối tượng, nhưng lưu ý rằng hầu hết chúng thường được gắn với một mẫu. Vì vậy, bạn có thể gọi chúng là "đối tượng" hoặc bạn có thể cụ thể hơn về ý định của nó và gọi nó bằng ý nghĩa của nó. Đây cũng là lý do tại sao chúng tôi có các mẫu thiết kế; để mô tả các khái niệm phức tạp trong một vài tác phẩm. DTO là một mô hình. Tổng hợp gốc là một mẫu, View Model là một mẫu (ví dụ: MVC & MVVM). POCO không phải là một mô hình.
Một POCO không mô tả một mô hình. Nó chỉ là một cách khác nhau để đề cập đến các lớp / đối tượng trong OOP. Hãy nghĩ về nó như một khái niệm trừu tượng; họ có thể đề cập đến bất cứ điều gì. IMO, có một mối quan hệ một chiều bởi vì một khi một đối tượng đạt đến điểm mà nó chỉ có thể phục vụ một mục đích sạch sẽ, thì đó không còn là POCO nữa. Ví dụ, một khi bạn đánh dấu lớp của mình bằng các đồ trang trí để làm cho nó hoạt động với một số khung công tác, nó không còn là POCO nữa. Vì thế:
- Một DTO là một POCO
- POCO không phải là DTO
- Mô hình xem là một POCO
- POCO không phải là Mô hình xem
Điểm quan trọng trong việc phân biệt giữa hai là về việc giữ cho các mẫu rõ ràng và nhất quán trong nỗ lực để không gây lo ngại và dẫn đến khớp nối chặt chẽ. Ví dụ: nếu bạn có một đối tượng kinh doanh có các phương thức để thay đổi trạng thái, nhưng cũng được trang trí thành địa ngục với các trang trí EF để lưu vào SQL Server VÀ JsonProperty để có thể gửi lại điểm cuối API. Đối tượng đó sẽ không dung nạp để thay đổi và có thể sẽ bị vấy bẩn bởi các biến thể của các thuộc tính (ví dụ: UserId, UserPk, UserKey, UserGuid, trong đó một số trong số chúng được đánh dấu để không được lưu vào DB và các đối tượng khác được đánh dấu để không được lưu vào JSON ở điểm cuối API).
Vì vậy, nếu bạn định nói với tôi một cái gì đó là DTO, thì có lẽ tôi chắc chắn rằng nó không bao giờ được sử dụng cho bất cứ thứ gì ngoài trạng thái chuyển động xung quanh. Nếu bạn nói với tôi một cái gì đó là một mô hình xem, thì có lẽ tôi chắc chắn rằng nó sẽ không được lưu vào cơ sở dữ liệu. Nếu bạn nói với tôi một cái gì đó là Mô hình miền, thì có lẽ tôi chắc chắn rằng nó không phụ thuộc vào bất cứ thứ gì bên ngoài miền. Nhưng nếu bạn nói với tôi điều gì đó là POCO, bạn thực sự sẽ không nói với tôi nhiều điều.