Guión:
Un cliente realiza un pedido y luego, después de recibir el producto, proporciona comentarios sobre el proceso del pedido.
Suponga las siguientes raíces agregadas:
- Cliente
- Orden
- Retroalimentación
Aquí están las reglas de negocio:
- Un cliente solo puede proporcionar comentarios sobre su propio pedido, no el de otra persona.
Un cliente solo puede proporcionar comentarios si el pedido ha sido pagado.
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; } }
Ahora, suponga que el negocio quiere una nueva regla:
Un cliente solo puede proporcionar comentarios si la
Supplier
mercancía de la orden todavía está en funcionamiento.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; } }
Coloqué la implementación de las dos primeras reglas dentro del Feedback
agregado mismo. Me siento cómodo haciendo esto, especialmente dado que el
Feedback
agregado hace referencia a todos los otros agregados por identidad. Por ejemplo, las propiedades del Feedback
componente indican que sabe de la
existencia de los otros agregados, por lo que me siento cómodo al tener que conocer también el estado de solo lectura de estos agregados.
Sin embargo, en función de sus propiedades, el Feedback
agregado no tiene conocimiento de la existencia del
Supplier
agregado, entonces, ¿debería tener conocimiento del estado de solo lectura de este agregado?
La solución alternativa para implementar la regla 3 es mover esta lógica a la apropiada CommandHandler
. Sin embargo, parece que está alejando la lógica del dominio del "centro" de mi arquitectura basada en la cebolla.
Supplier
el estado operativo de un agregado no se consultaría a través de un Order
repositorio; Supplier
y Order
son dos agregados separados. En segundo lugar, había una pregunta en la lista de correo DDD / CQRS acerca de pasar raíces y repositorios agregados a otros métodos de raíz agregada (incluido el constructor). Hubo una variedad de opiniones, pero Greg Young mencionó que pasar raíces agregadas como parámetros es común, mientras que otra persona dijo que los repositorios están más estrechamente relacionados con la infraestructura que con el dominio. Por ejemplo, los repositorios "abstractos en colecciones de memoria" y no tienen lógica.
Customer
solo puede proporcionar comentarios sobre uno de sus propios pedidos ( $order->customerId() == $customer->customerId()
), también tenemos que comparar la ID del proveedor ( $order->supplierId() == $supplier->supplierId()
). La primera regla protege contra el usuario que proporciona valores incorrectos. La segunda regla protege contra el programador que proporciona valores incorrectos. Sin embargo, la verificación de si el proveedor está operando debe realizarse en la Feedback
entidad o en el controlador de comandos. ¿Dónde está la pregunta?