2010-06-07 11 views
1

En supposant qu'aucun ORM (par exemple Doctrine) ne soit utilisé à l'intérieur du Repository, ma question est la suivante: quelle est la bonne méthode pour instancier les objets Aggregate? Instance-t-il directement les objets enfants dans le référentiel et les affecte-t-il simplement à la racine agrégée par l'intermédiaire de ses paramètres ou la racine agrégée est-elle responsable de la construction de ses entités/objets enfants?Reconstitution correcte des objets Aggregate dans le Repository?

Exemple 1:

class UserRepository 
{ 
    // Create user domain entity. 
    $user = new User(); 
    $user->setName('Juan'); 

    // Create child object orders entity. 
    $orders = new Orders($orders); 
    $user->setOrders($orders); 
} 

Exemple 2:

class UserRepository 
{ 
    // Create user domain entity. 
    $user = new User(); 
    $user->setName('Juan'); 

    // Get orders. 
    $orders = $ordersDao->findByUser(1); 
    $user->setOrders($orders); 
} 

alors que dans l'exemple 2, instanciation des ordres sont pris en charge à l'intérieur de l'entité utilisatrice.

+0

Je ne suis pas vraiment sûr (ne comprends pas complètement la question) mais le commentaire à la fin qui dit "les commandes sont prises en charge à l'intérieur de l'entité utilisateur" - Je pense que vous ne voulez pas faire cela. Les entités ne veulent pas s'installer elles-mêmes. Si vous devez déléguer ce type de responsabilité à l'intérieur d'une entité, vous devez le remplacer par un service de domaine. –

Répondre

3

Vous devriez certainement utiliser le constructeur pour créer des objets, pas des setters. L'un des principes importants de DDD est l'intention de communiquer. Si le nom est requis pour créer un utilisateur, vous communiquez clairement cette exigence en autorisant uniquement la création d'une instance d'utilisateur si un nom est fourni. Ceux-ci sont appelés "invariants" et doivent toujours être satisfaits avant la création d'un objet. De cette façon, vous dites clairement "c'est ce que vous devez fournir avant que cet objet soit dans un état valide".

Lors de la reconstitution d'un objet (par exemple dans un référentiel), vous devez transmettre les objets enfants au constructeur. Dans mon expérience, mes agrégats ont 2 constructeurs: un pour la création (éventuellement appelé par une usine), et un pour la reconstitution (généralement appelé par un référentiel).