Giả sử chúng ta có kiến trúc lấy cảm hứng từ CQRS, với các thành phần như Lệnh, Mô hình miền, Sự kiện miền, Đọc mô hình DTO.
Tất nhiên, chúng ta có thể sử dụng các đối tượng giá trị trong Mô hình miền của chúng tôi. Câu hỏi của tôi là, họ cũng nên được sử dụng trong:Đối tượng giá trị trong CQRS - nơi sử dụng
- Commands
- Sự kiện
- DTOs
Tôi chưa thấy bất kỳ ví dụ nơi Value Objects (VO) được sử dụng trong các thành phần đã đề cập ở trên. Thay vào đó, các kiểu nguyên thủy được sử dụng. Có lẽ nó chỉ là những ví dụ đơn giản. Sau khi tất cả, sự hiểu biết của tôi về VOs sử dụng trong DDD là chúng hoạt động như một chất keo dán cho toàn bộ ứng dụng.
Động lực của tôi:
Lệnh.
Giả sử người dùng gửi biểu mẫu chứa trường địa chỉ. Chúng ta có Object Value Object để biểu diễn khái niệm này. Khi xây dựng lệnh trong máy khách, chúng ta nên xác nhận hợp lệ đầu vào của người dùng, và khi nó được tạo đúng, chúng ta có thể tạo đối tượng Address ngay tại đó và khởi tạo Command với nó. Tôi thấy không cần ủy quyền tạo đối tượng Address cho trình xử lý lệnh.
Sự kiện miền.
Mô hình miền đã hoạt động về các đối tượng giá trị, do đó, bằng cách xuất bản sự kiện với VO thay vì chuyển đổi chúng thành các kiểu nguyên thủy, chúng ta có thể tránh một số mã ánh xạ. Tôi khá chắc chắn rằng nó không sao để sử dụng VO trong trường hợp này.
DTO.
Nếu DTO phía truy vấn của chúng tôi có thể chứa đối tượng giá trị, điều này cho phép tính linh hoạt hơn. Ví dụ: nếu chúng tôi có đối tượng Money, chúng tôi có thể chọn hiển thị nó bằng EUR hoặc USD, không cần phải thay đổi Đọc mô hình.
Sau khi cân nhắc điều này một thời gian, kết luận của tôi: có các đối tượng hành vi phong phú trong Sự kiện đơn giản là không thể được, vì chúng phải thể hiện dữ liệu lịch sử và chúng tôi không có cách nào để tuần tự hóa hành vi ngày hôm nay. Đối với các lệnh DTO, các lệnh này có thể hoạt động, và nó vẫn chưa rõ ràng cho tôi nếu khớp nối mà nó giới thiệu là chấp nhận được hay không (dù sao, đây là nhiều hơn về 'cả hai lớp Domain và Presentation nên tham khảo cùng một sự thực thi của Money VO' thay vì 'nên TransferMoneyCommand chứa tiền VO hoặc MoneyDTO'). – driushkin