2017-03-10 1 views
0

Envisagez le scénario suivant:DDD - Obtenir l'entité par agrégat, invoquer la méthode ou cacher la méthode de l'entité derrière la méthode aggegrate?

class Order: 

    def __init__(self): 
     self.lines = [] 

    def order(self, product_id, amount, price, discount=None): 
     item = OrderItem(product_id, amount, price) 
     self.lines.append(item) 

class OrderItem: 

    def __init__(self, product_id, amount, price, discount=None): 
     self.product_id = product_id 
     self.amount = amount 
     self.price = price 
     self.discount = discount or decimal.Decimal(0) 

    def discount(self, amount): 
     self.discount = discount 

Dans le scénario que nous voulons ajouter un rabais à un élément de ligne spécifique, après l'agrégat Order a été créé, ai-je besoin pour obtenir l'entité OrderItem de l'agrégat, ou exposer une méthode sur l'agrégat?

E.g.

class Order: 

    ... 

    def discount_item(self, index, amount): 
     self.lines[index].discount(amount) 

Et si je peux appeler la OrderItem.discount() directement - comment puis-je garder une trace des événements de domaine publiés à la suite de cela?

Répondre

1

Chaque modification apportée à l'agrégat doit être effectuée via les méthodes publiques de l'agrégat root. De cette façon, vous pouvez être sûr que l'agrégat est toujours dans l'état cohérent. Sinon, vous pourriez facilement casser la cohérence de l'agrégat en modifiant les entités internes des agrégats. L'ensemble du concept d'agrégat consiste à conserver toutes les entités et tous les objets de valeur dans l'agrégat dans un état valide. Donc, dans votre cas, vous pouvez ajouter une méthode similaire à celle de la racine globale Order:

def applyDiscountForItem(self, itemPosition, amount): 
    // apply the discount on item identified by itemPosition 

Si vous suivez cette règle, la cohérence de l'ensemble est garanti. La racine agrégée est le point d'entrée unique pour apporter des modifications à l'agrégat, il est donc assez facile d'ajouter toute la logique métier et la validation à la racine. Cependant, lorsque votre agrégat devient plus grand, il peut y avoir beaucoup de méthodes "proxy" dans la racine. Si c'est le cas, alors votre agrégat devient probablement trop grand et doit être divisé en plusieurs agrégats. C'est généralement une bonne idée de garder les agrégats relativement petits. Souvent, les meilleurs agrégats consistent seulement en une entité (la racine agrégée elle-même) et en plusieurs objets de valeur.