J'essaie de comprendre comment utiliser correctement le modèle de référentiel. Le concept central d'une racine agrégée revient sans cesse. Lorsque je cherche à la fois sur le Web et sur Stack Overflow pour savoir ce qu'est une racine agrégée, je continue à trouver des discussions à leur sujet et des liens morts vers des pages qui sont censées contenir des définitions de base.
Dans le contexte du modèle de référentiel, qu'est-ce qu'une racine agrégée?
Réponses:
Dans le contexte du modèle de référentiel, les racines d'agrégat sont les seuls objets que votre code client charge à partir du référentiel.
Le référentiel encapsule l'accès aux objets enfants - du point de vue de l'appelant, il les charge automatiquement, soit en même temps que la racine est chargée ou quand ils sont réellement nécessaires (comme avec le chargement paresseux).
Par exemple, vous pourriez avoir un
Order
objet qui encapsule des opérations sur plusieursLineItem
objets. Votre code client ne chargerait jamais lesLineItem
objets directement, juste celuiOrder
qui les contient, qui serait la racine agrégée de cette partie de votre domaine.la source
De Evans DDD:
Et:
Cela signifie que les racines agrégées sont les seuls objets qui peuvent être chargés à partir d'un référentiel.
Un exemple est un modèle contenant une
Customer
entité et uneAddress
entité. Nous n'aurions jamais accès à uneAddress
entité directement à partir du modèle car cela n'a pas de sens sans le contexte d'un associéCustomer
. Nous pourrions donc dire queCustomer
etAddress
former ensemble un agrégat et c'estCustomer
une racine agrégée.la source
Each AGGREGATE has a root
etThe root is the only *member* of the AGGREGATE
- ce verbage implique que la racine est une propriété sur l'agrégat. Mais dans tous les exemples, c'est l'inverse: la racine contient des propriétés qui sont des agrégats. Pouvez-vous clarifier?Customer
classe est-elle considérée comme la racine agrégée ou lesCustomer
instances ?La racine agrégée est un nom complexe pour une idée simple.
Idée générale
Un diagramme de classe bien conçu encapsule ses éléments internes. Le point par lequel vous accédez à cette structure est appelé
aggregate root
.Les composants internes de votre solution peuvent être très compliqués, mais l'utilisateur de cette hiérarchie utilisera simplement
root.doSomethingWhichHasBusinessMeaning()
.Exemple
Vérifiez cette hiérarchie de classes simple
Comment voulez-vous conduire votre voiture? Choisissez une meilleure API
Option A (cela fonctionne simplement):
Option B (l'utilisateur a accès aux inernals de classe):
Si vous pensez que l'option A est meilleure, alors félicitations. Vous obtenez la raison principale derrière
aggregate root
.La racine agrégée encapsule plusieurs classes. vous pouvez manipuler toute la hiérarchie uniquement via l'objet principal.
la source
car
la racine agrégée. Vous pouvez également autoriser une situation comme celle du dessin. La bonne solution dépend du modèle commercial de l'application. Cela peut être différent dans chaque cas.Imaginez que vous ayez une entité Ordinateur, cette entité ne peut pas non plus vivre sans son entité Logiciel et son entité Matériel. Ceux-ci forment l'
Computer
agrégat, le mini-écosystème de la partie informatique du domaine.La racine agrégée est l'entité mère à l'intérieur de l'agrégat (dans notre cas
Computer
), il est courant que votre référentiel ne fonctionne qu'avec les entités qui sont des racines agrégées, et cette entité est responsable de l'initialisation des autres entités.Considérez la racine d'agrégat comme point d'entrée d'un agrégat.
En code C #:
Gardez à l'esprit que le matériel serait probablement aussi un ValueObject (ne possède pas d'identité à lui seul), considérez-le comme un exemple uniquement.
la source
where T : IAggregateRoot
- Celui-ci a fait ma journéeSi vous suivez une approche basée sur la base de données, la racine agrégée est généralement la table du côté 1 d'une relation 1-plusieurs.
L'exemple le plus courant étant une personne. Chaque personne a plusieurs adresses, un ou plusieurs bulletins de paie, factures, entrées CRM, etc. Ce n'est pas toujours le cas, mais 9/10 fois.
Nous travaillons actuellement sur une plateforme de commerce électronique et nous avons essentiellement deux racines agrégées:
Les clients fournissent des informations de contact, nous leur attribuons des transactions, les transactions obtiennent des éléments de ligne, etc.
Les vendeurs vendent des produits, ont des contacts, des pages sur nous, des offres spéciales, etc.
Ceux-ci sont pris en charge par le référentiel client et vendeur respectivement.
la source
Dinah:
Dans le contexte d'un référentiel, la racine agrégée est une entité sans entité parent. Il contient zéro, une ou plusieurs entités enfants dont l'existence dépend du parent pour son identité. C'est une relation un à plusieurs dans un référentiel. Ces entités enfants sont de simples agrégats.
la source
À partir d'un lien brisé :
Dans un agrégat, il y a une racine d'agrégat. La racine d'agrégat est l'entité parente de toutes les autres entités et objets de valeur au sein de l'agrégat.
Un référentiel fonctionne sur une racine agrégée.
Plus d'informations peuvent également être trouvées ici .
la source
L'agrégat signifie la collecte de quelque chose.
racine est comme le nœud supérieur de l'arbre, d'où nous pouvons accéder à tout comme le
<html>
nœud dans le document de la page Web.Blog Analogy, Un utilisateur peut avoir de nombreux articles et chaque article peut avoir de nombreux commentaires. Donc, si nous récupérons un utilisateur, il peut agir en tant que root pour accéder à tous les messages associés et autres commentaires de ces messages. Ce sont tous ensemble dit être collection ou agrégé
la source
L'agrégat est l'endroit où vous protégez vos invariants et forcez la cohérence en limitant son accès à la racine agrégée. N'oubliez pas, l'agrégat doit se baser sur les règles métier et les invariants de votre projet, et non sur la relation avec la base de données. vous ne devez injecter aucun référentiel et aucune requête n'est autorisée.
la source
À Erlang, il n'est pas nécessaire de différencier les agrégats, une fois que l'agrégat est composé de structures de données à l'intérieur de l'État, au lieu de la composition OO. Voir un exemple: https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-london
la source