Question

Je refactorise un projet utilisant DDD, mais je suis soucieux de ne pas faire trop d'entités leur propre racine agrégée.

j'ai un Store, qui a une liste de ProductOptions et une liste de Products. UN ProductOption peut être utilisé par plusieurs Products. Ces entités semblent s'adapter au Store regroupez assez bien.

Alors j'ai un Order, qui utilise de manière transitoire un Product Pour construire son OrderLineS:

class Order {
    // ...
    public function addOrderLine(Product $product, $quantity) {
        $orderLine = new OrderLine($product, $quantity);
        $this->orderLines->add($orderLine);
    }
}

class OrderLine {
    // ...
    public function __construct(Product $product, $quantity) {
        $this->productName = $product->getName();
        $this->basePrice = $product->getPrice();
        $this->quantity = $quantity;
    }
}

On dirait que pour l'instant, DDD règne comme respecté. Mais j'aimerais ajouter une exigence, qui pourrait enfreindre les règles de l'ensemble: le propriétaire du magasin devra parfois vérifier les statistiques sur les commandes qui comprenaient un produit particulier.

Cela signifie que fondamentalement, nous aurions besoin de conserver une référence au produit dans la ligne d'ordre, mais cela jamais être utilisé par n'importe quelle méthode à l'intérieur de l'entité. Nous n'utiliserions ces informations que à des fins de déclaration, lors de la question de l'interrogation de la base de données; Ainsi, il ne serait pas possible de "rompre" quoi que ce soit à l'intérieur de l'agrégat du magasin en raison de cette référence interne:

class OrderLine {
    // ...
    public function __construct(Product $product, $quantity) {
        $this->productName = $product->getName();
        $this->basePrice = $product->getPrice();
        $this->quantity = $quantity;

        // store this information, but don't use it in any method
        $this->product = $product;
    }
}

Cette exigence simple dicte-t-elle que le produit devient une racine agrégée? Cela se casserait également à la productation de devenir une racine globale, car le produit a fait référence à lui, ce qui entraîne deux agrégats qui n'ont aucun sens en dehors d'un magasin, et n'auront besoin d'aucun référentiel; Ça me semble bizarre.

Tout commentaire est le bienvenu!

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top