Introducción aburrida:DDD, manejo de dependencias
Lo sé - DDD no se trata de tecnología. Como lo veo, DDD se trata de crear un lenguaje ubicuo con el propietario del producto y reflejarlo en el código de una manera tan simple y estructurada, que simplemente no se puede malinterpretar o perder.
Pero aquí viene una paradoja en juego: para deshacerse de la parte técnica de la aplicación en el modelo de dominio, se vuelve una técnica amable, al menos desde la perspectiva del diseño.
La última vez que traté de seguir a DDD, terminó con toda la lógica fuera de los objetos de dominio en servicios 'mágicos' y un modelo de dominio anémico.
He aprendido algunos nuevos trucos ninja y me pregunto si podría manejar a Goliath esta vez.
Problema:
class store : aggregateRoot {
products;
addProduct(product){
if (new FreshSpecification.IsSatisfiedBy(product))
products.add(product);
}
}
class product : entity {
productType;
date producedOn;
}
class productTypeValidityTerm : aggregateRoot {
productType;
days;
}
FreshSpecification
se supone que debe especificar si el producto no huele. Para hacerlo, debe verificar el tipo de producto, buscar por cuánto tiempo el producto está fresco y compararlo con producedOn
. Clase un simple.
Pero aquí viene el problema - productTypeValidityTerm
y productType
se supone que son administrados por el cliente. Él debería ser capaz de agregar/modificar libremente esos. Como no puedo atravesar directamente el producto a productTypeValidityTerm
, necesito consultarlos de alguna manera por productType
.
Anteriormente - crearía algo como ProductService
que recibe repositorios necesarios a través del constructor, términos de consultas, realiza algunos vudú adicionales y devuelve booleano (sacando la lógica relevante del objeto mismo y dispersándolo quién sabe dónde).
pensé que podría ser aceptable para hacer algo como esto:
addProduct(product, productTypeValidityTermRepository){...}
Pero, de nuevo - no pude componer especificaciones de múltiples especificaciones debajo libremente lo que es una de sus principales ventajas.
Entonces, la pregunta es, ¿dónde hacer eso? ¿Cómo la tienda puede estar al tanto de los términos?
+1 Buena pregunta. Todavía estoy luchando con esto, pero aquí hay un intento anterior de responder algo similar: http://stackoverflow.com/questions/1264944/refactoring-domain-logic-that-accesses-repositories-in-a-legacy-system/1265055 # 1265055 –