2010-06-03 3 views
3

Dans DDD, Repository prend en charge l'enregistrement et la récupération des objets de domaine et sert également de collection de racines agrégées. Ma question est de savoir comment récupérer l'information pour ces entités enfant (disons de DB) d'un agrégat où la règle de base est Repository devrait juste contenir la collection de racines agrégées (objet parent) et pas les objets enfants?Comment récupérer des objets Aggregate?

Par exemple:

utilisateur (objet parent) Ordres (objet enfant)

objet de domaine utilisateur sont stockées dans le tableau de l'utilisateur et les commandes sont stockées dans une autre table.

Fondamentalement, la récupération d'un objet de domaine pourrait ressembler à ceci:

<?php 
$userRepos = new UserRepository(); 
$user = $userRepos->find($userId); 
?> 

Comment puis l'objet enfant (ordres) de l'entité utilisateur se récupérer comme dans le cadre de l'ensemble des utilisateurs?

+0

Pouvez-vous démontrer comment construire un agrégat simple à partir d'une base de données avec Repository? – Jebb

Répondre

2

Je crois que même si les référentiels contiennent uniquement des références aux racines agrégées, les racines agrégées contiendront des références à leurs objets enfants (objets valeur). Ainsi, les usines qui génèrent les objets Agrégat construisent ces références "internes" entre les objets Agréger les racines et les objets Valeur, et seulement la racine agrégée doit être placée dans les référentiels. Ensuite, il s'agit simplement de récupérer ces objets enfants une fois que vous avez extrait une racine agrégée du référentiel (via une simple API getter).

+1

Les référentiels doivent découpler ou isoler le domaine de la persistance. Récupération d'un objet de domaine unique (par exemple Utilisateur) depuis le stockage/via un référentiel (par exemple UserRepository) est logique, la question est de savoir où extraire un agrégat au lieu d'un seul objet de domaine, comment extraire ces objets enfants qui forment l'agrégat? Grâce à Repository également? Mais les référentiels sont fournis uniquement pour les racines agrégées et non pour les objets enfants de l'agrégat. – Jebb

+0

Oui les agrégats sont stockés dans les objets de domaine de repo. Dans le cas d'agrégats, ils ont des références internes à leurs objets enfants. Vous ne devriez jamais essayer de récupérer directement un agrégat enfants du repo. avec une liste de commandes en tant qu'enfant (les commandes associées à un utilisateur). Pour ce faire, vous devez d'abord récupérer l'objet utilisateur du repo.Vous pouvez ensuite utiliser une méthode getter sur l'objet utilisateur lui-même pour extraire l'objet enfant orders (puisque la racine aggregates est le seul objet qui donne accès aux enfants) –

+1

Merci Eric. Oui, je suis d'accord avec vous, obtenir/interagir objet enfant (commandes) dans un agrégat doit être fait par la racine agrégée (utilisateur), peut-être le contexte de ma question se trouve dans le référentiel lui-même, en supposant qu'aucun ORM (comme Doctrine 2) implémenté dans le référentiel. – Jebb

Questions connexes