Kịch bản:
Một khách hàng đặt hàng, sau đó, sau khi nhận được sản phẩm, cung cấp phản hồi về quy trình đặt hàng.
Giả sử các gốc tổng hợp sau:
- khách hàng
- Đặt hàng
- Phản hồi
Dưới đây là các quy tắc kinh doanh:
- Một khách hàng chỉ có thể cung cấp phản hồi về đơn đặt hàng của họ, không phải của người khác.
Một khách hàng chỉ có thể cung cấp thông tin phản hồi nếu đơn đặt hàng đã được thanh toán.
class Feedback { public function __construct($feedbackId, Customer $customer, Order $order, $content) { if ($customer->customerId() != $order->customerId()) { // Error } if (!$order->isPaid()) { // Error } $this->feedbackId = $feedbackId; $this->customerId = $customerId; $this->orderId = $orderId; $this->content = $content; } }
Bây giờ, giả sử doanh nghiệp muốn một quy tắc mới:
Một khách hàng chỉ có thể cung cấp thông tin phản hồi nếu
Supplier
hàng hóa của đơn đặt hàng vẫn đang hoạt động.class Feedback { public function __construct($feedbackId, Customer $customer, Order $order, Supplier $supplier, $content) { if ($customer->customerId() != $order->customerId()) { // Error } if (!$order->isPaid()) { // Error } // NEW RULE HERE if (!$supplier->isOperating()) { // Error } $this->feedbackId = $feedbackId; $this->customerId = $customerId; $this->orderId = $orderId; $this->content = $content; } }
Tôi đã đặt việc thực hiện hai quy tắc đầu tiên trong Feedback
chính tổng hợp. Tôi cảm thấy thoải mái khi làm điều này, đặc biệt là khi
Feedback
tổng hợp tham chiếu tất cả các tổng hợp khác theo danh tính. Ví dụ, các thuộc tính của Feedback
thành phần chỉ ra rằng nó biết về sự
tồn tại của các tập hợp khác, vì vậy tôi cảm thấy thoải mái khi biết về trạng thái chỉ đọc của các tập hợp này.
Tuy nhiên, dựa trên các thuộc tính của nó, Feedback
tập hợp không có kiến thức về sự tồn tại của
Supplier
tập hợp, vậy nó có nên có kiến thức về trạng thái chỉ đọc của tập hợp này không?
Giải pháp thay thế để thực hiện quy tắc 3 là di chuyển logic này đến mức phù hợp CommandHandler
. Tuy nhiên, điều này cảm thấy như nó di chuyển logic miền ra khỏi "trung tâm" của kiến trúc dựa trên hành tây của tôi.
Supplier
trạng thái hoạt động của tổng hợp sẽ không được truy vấn thông qua Order
kho lưu trữ; Supplier
và Order
là hai tập hợp riêng biệt. Thứ hai, có một câu hỏi trong danh sách gửi thư DDD / CQRS về việc chuyển các gốc và kho tổng hợp cho các phương thức gốc tổng hợp khác (bao gồm cả hàm tạo). Có nhiều ý kiến khác nhau, nhưng Greg Young đã đề cập rằng việc chuyển các gốc tổng hợp làm tham số là phổ biến, trong khi một người khác nói rằng các kho lưu trữ có liên quan chặt chẽ hơn đến cơ sở hạ tầng hơn là miền. Ví dụ, kho "trừu tượng trong bộ sưu tập bộ nhớ" và không có logic.
Customer
chỉ có thể cung cấp phản hồi về một trong các đơn đặt hàng của riêng họ ( $order->customerId() == $customer->customerId()
), chúng tôi cũng phải so sánh ID nhà cung cấp ( $order->supplierId() == $supplier->supplierId()
). Các quy tắc bảo vệ đầu tiên chống lại người dùng cung cấp các giá trị không chính xác. Các quy tắc bảo vệ thứ hai chống lại các lập trình viên cung cấp các giá trị không chính xác. Tuy nhiên, việc kiểm tra xem nhà cung cấp đang hoạt động phải ở trong Feedback
thực thể hay trong bộ xử lý lệnh. Câu hỏi ở đâu