Ce qui est un Agrégat de la Racine?

j'essaie de savoir comment utiliser correctement le motif du dépôt. Le concept central d'une racine agrégée ne cesse de surgir. En cherchant à la fois le Web et le débordement de la pile pour obtenir de l'aide sur 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 dépôt, qu'est-ce qu'une racine agrégée?

355
demandé sur Dinah 2009-12-24 18:02:31

10 réponses

dans le contexte de la configuration du dépôt, aggregate roots sont les seuls objets que votre code client charge à partir du dépôt.

le dépôt encapsule l'accès aux objets enfant - du point de vue de l'appelant, il les charge automatiquement, soit en même temps que la racine est chargée, soit quand ils sont réellement nécessaires (comme avec le chargement paresseux).

par exemple, vous pourriez avoir un objet Order qui encapsule des opérations sur plusieurs LineItem des objets. Votre code client ne chargera jamais les objets LineItem directement, juste le Order qui les Contient, qui serait la racine agrégée pour cette partie de votre domaine.

247
répondu Jeff Sternal 2009-12-24 19:46:51

From Evans DDD:

un agrégat est un ensemble d'objets associés que nous traitons comme une unité aux fins des changements de données. Chaque agrégat a une racine et une limite. La limite définit ce qui se trouve à l'intérieur de l'agrégat. La racine est une entité unique et spécifique contenue dans L'agrégat.

et:

la racine est le seul membre de L'agrégat que les objets extérieurs sont permis de contenir des références[.]

cela signifie que aggregate roots sont les seuls objets qui peuvent être chargés à partir d'un dépôt.

un exemple est un modèle contenant une entité Customer et une entité Address . Nous n'aurions jamais accès à une entité Address directement à partir du modèle car cela n'a pas de sens sans le contexte d'un Customer associé . On pourrait donc dire que Customer et Address forment ensemble une et que Customer est une racine agrégée.

158
répondu jason 2009-12-24 15:44:58

Aggregate root est un nom complexe pour simple idea.


idée Générale

schéma de classe bien conçu encapsule ses internes. Le Point par lequel vous accédez à cette structure est appelé aggregate root .

enter image description here

internes de votre solution peut être très compliqué, mais l'utilisateur de cette hiérarchie sera juste utiliser root.doSomethingWhichHasBusinessMeaning() .


exemple

Vérifiez cette hiérarchie de classe simple enter image description here

Comment voulez-vous conduire votre voiture? Choisir une meilleure api

l'Option A (juste fonctionne en quelque sorte):

car.ride();

Option B (l'Utilisateur a accès à la classe inernals):

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

si vous pensez que l'option A est mieux alors félicitations. Vous avez la principale raison derrière aggregate root .


racine d'Agrégat encapsule plusieurs classes. vous pouvez manipuler la hiérarchie entière seulement par l'objet principal.

58
répondu Marcin Szymczak 2015-09-25 12:34:31

Imaginez que vous ayez une entité Informatique, cette entité non plus ne peut pas vivre sans son entité logicielle et matérielle. Ceux-ci forment l'agrégat Computer , le mini-écosystème pour la partie informatique du domaine.

Aggregate Root est l'entité mère à l'intérieur de l'agrégat (dans notre cas Computer ), c'est une pratique courante que votre dépôt ne fonctionne qu'avec les entités qui sont des racines agrégées, et cette entité est responsable de l'initialisation des d'autres entités.

Examiner la Racine d'Agrégat comme un Point d'Entrée à un Agrégat.

Dans le code C#:

public class Computer : IEntity, IAggregateRoot
{
    public Hardware Hardware { get; set; }
    public Software Software { get; set; }
}

public class Hardware : IEntity { }
public class Software : IValueObject { }

public class Repository<T> : IRepository<T> where T : IAggregateRoot {}

gardez à l'esprit que le matériel serait probablement un objet de valeur aussi (ne pas avoir d'identité sur son propre), considérez-le comme un exemple seulement.

27
répondu Francisco Aquino 2010-08-23 17:24:51

si vous suivez une base de données-première approche, vous Agrégez root est généralement la table sur le côté 1 d'une relation 1-beaucoup.

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 ça l'est 9/10 fois.

nous travaillons actuellement sur une plateforme de commerce électronique, et nous avons essentiellement deux racines globales:

  1. Clients
  2. Vendeurs

clients fournir l'information de contact, nous leur assignons des transactions, transactions obtenir des articles de ligne, etc.

les Vendeurs de vendre des produits, ont les personnes de contact, a propos de nous pages, offres spéciales, etc.

ceux-ci sont pris en charge par le référentiel client et vendeur respectivement.

11
répondu Captain Kenpachi 2013-09-10 08:15:00

à Partir d'un lien brisé :

dans un agrégat il y a une racine agrégée. La racine agrégat est L'entité mère de toutes les autres entités et Objets de valeur à l'intérieur de L'agrégat.

un dépôt fonctionne sur une racine agrégée.

plus d'informations peuvent également être trouvées ici .

8
répondu Otávio Décio 2009-12-24 15:12:46

Dinah:

dans le contexte D'un dépôt, la racine agrégée est une entité sans entité mère. Il contient zéro, un ou plusieurs enfants entités dont l'existence dépend du Parent pour son identité. C'est une relation de un à plusieurs dans un dépôt. Ces entités pour enfants sont des agrégats simples.

enter image description here

7
répondu Ibrahim Malluf 2016-12-05 04:45:41

total signifie la collecte de quelque chose.

root est comme le noeud supérieur de l'arbre, d'où nous pouvons accéder à tout comme <html> noeud dans le document de la page web.

Blog Analogie, Un utilisateur peut avoir plusieurs postes et chaque poste peut avoir de nombreux commentaires. donc si nous récupérons n'importe quel utilisateur alors il peut agir comme root pour accéder à tous les postes liés et d'autres commentaires de ces postes. Ils sont tous considérés comme collectés ou agrégé

3
répondu palash140 2016-08-16 20:24:54

dans Erlang, il n'est pas nécessaire de différencier les agrégats, une fois que l'agrégat est composé par des 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

0
répondu Henry H. 2016-03-09 12:27:29

Aggregate est l'endroit où vous protégez vos invariants et la cohérence de force en limitant son accès pensée agrégat racine. N'oubliez pas, aggregate devrait concevoir sur vos règles d'affaires de projet et invariants, pas la relation de base de données. vous ne devez injecter Aucun dépôt et aucune requête n'est pas autorisée.

0
répondu Alireza Rahmani 2017-09-16 09:02:48