Tengo algunas dificultades para encontrar la mejor manera de manejar un escenario bastante complejo. He visto bastantes preguntas similares, pero ninguna abordaba este escenario a mi satisfacción.DDD - Modificaciones de objetos secundarios dentro del agregado
Se crea una orden (raíz de agregado) con varias líneas de pedido (entidades secundarias). De acuerdo con las reglas comerciales, cada OrderLine debe mantener la misma identidad durante la vigencia de la Orden. Las líneas de pedido tienen muchas (más de 20) propiedades y pueden mutarse con bastante frecuencia antes de que la orden se considere "bloqueada". Además, hay invariantes que deben aplicarse en el nivel raíz; por ejemplo, cada línea de pedido tiene una cantidad y la cantidad total para el pedido no puede exceder X.
No estoy seguro de cómo modelar este escenario al considerar cambios en OrderLines. Tengo 4 opciones que puedo concebir, pero ninguna parece satisfactoria:
1) Cuando llegue el momento de modificar una OrderLine, hágalo utilizando una referencia proporcionada por la raíz. Pero pierdo la capacidad de verificar la lógica invariante en la raíz.
var orderLine = order.GetOrderLine(id);
orderLine.Quantity = 6;
2) Llame a un método del pedido. Puedo aplicar toda lógica invariante, pero estoy atascado con una proliferación de métodos para modificar las muchas propiedades de la OrderLine:
order.UpdateOrderLineQuantity(id, 6);
order.UpdateOrderLineDescription(id, description);
order.UpdateOrderLineProduct(id, product);
...
3) Esto podría ser más fácil si el tratado OrderLine como un objeto de valor, pero debe mantener la misma identidad según los requisitos del negocio.
4) Puedo obtener referencias a las líneas de pedido para las modificaciones que no afectan invariantes, y pasar por el pedido para aquellos que sí lo hacen. Pero, ¿qué ocurre si las invariantes se ven afectadas por la mayoría de las propiedades de OrderLine? Esta objeción es hipotética, ya que solo unas pocas propiedades pueden afectar a las invariantes, pero eso puede cambiar a medida que descubramos más lógica comercial.
Cualquier sugerencia es apreciada ... no dude en hacérmelo saber si estoy siendo muy exigente.
Gracias por su respuesta, creo que es probablemente mi mejor opción de las que presenté. Realmente estaba esperando que alguien sugiriera un patrón mejor que pueda haber pasado por alto;) Estoy un poco receloso de usarlo, porque no está limpio. O tal vez una mejor manera de decirlo ... no consistente, como señaló @eulerfx. Pero supongo que lo hará por ahora ... – Cork
Sé que acepté esto como una respuesta ya ... pero pensé en un enfoque diferente. ¿Sería correcto tener un método Save (IOrderLine) en el pedido? Entonces puedo pasarle una referencia a la Orden, evitar un montón de métodos granulares y aún permitirle a la Orden aplicar invariantes. – Cork