it-swarm.com.de

Was ist eine Gesamtwurzel?

Ich versuche mir ein Bild davon zu machen, wie man das Repository-Muster richtig einsetzt. Das zentrale Konzept einer aggregierten Wurzel taucht immer wieder auf. Wenn ich sowohl im Web als auch in Stack Overflow nach Hilfe zu einer Gesamtwurzel suche, finde ich immer wieder Diskussionen darüber und tote Links zu Seiten, die Basisdefinitionen enthalten sollen.

Im Kontext des Repository-Musters ist was ist eine aggregierte Wurzel?

408
Dinah

Im Kontext des Repository-Musters sind aggregierte Roots die einzigen Objekte, die Ihr Client-Code aus dem Repository lädt.

Das Repository kapselt den Zugriff auf untergeordnete Objekte - aus Sicht eines Aufrufers werden diese automatisch geladen, entweder beim Laden des Stammverzeichnisses oder wenn sie tatsächlich benötigt werden (wie beim verzögerten Laden).

Beispielsweise könnten Sie ein Order -Objekt haben, das Operationen für mehrere LineItem -Objekte kapselt. Ihr Client-Code würde niemals die LineItem -Objekte direkt laden, sondern nur das Order, in dem sie enthalten sind. Dies wäre das Gesamtstammverzeichnis für diesen Teil Ihrer Domain.

283
Jeff Sternal

Von Evans DDD:

Ein AGGREGATE ist ein Cluster zusammengehöriger Objekte, die wir zum Zweck der Datenänderung als Einheit behandeln. Jedes AGGREGATE hat eine Wurzel und eine Grenze. Die Grenze definiert, was sich im AGGREGATE befindet. Die Wurzel ist eine einzelne, spezifische ENTITÄT, die im AGGREGATE enthalten ist.

Und:

Der Root ist das einzige Mitglied des AGGREGATE, das externen Objekten erlaubt, Verweise auf [.] Zu speichern.

Dies bedeutet, dass Aggregatwurzeln die einzigen Objekte sind, die aus einem Repository geladen werden können.

Ein Beispiel ist ein Modell, das eine Entität Customer und eine Entität Address enthält. Wir würden niemals direkt aus dem Modell auf eine Address -Entität zugreifen, da dies ohne den Kontext eines zugeordneten Customer keinen Sinn ergibt. Wir könnten also sagen, dass Customer und Address zusammen ein Aggregat bilden und dass Customer eine aggregierte Wurzel ist.

186
jason

Aggregate Root ist ein komplexer Name für eine einfache Idee.


Grund Idee

Ein gut gestaltetes Klassendiagramm kapselt seine Interna. Der Punkt, über den Sie auf diese Struktur zugreifen, heißt aggregate root.

enter image description here

Interna Ihrer Lösung können sehr kompliziert sein, aber Benutzer dieser Hierarchie verwenden nur root.doSomethingWhichHasBusinessMeaning().


Beispiel

Überprüfen Sie diese einfache Klassenhierarchie enter image description here

Wie willst du mit dem Auto fahren? Wählte bessere API

Option A (es funktioniert einfach irgendwie):

car.ride();

Option B (Benutzer hat Zugriff auf Klasseninternale):

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

Wenn Sie der Meinung sind, dass Option A besser ist, dann gratulieren Sie. Sie bekommen Hauptgrund hinter aggregate root.


Aggregate Root kapselt mehrere Klassen. Sie können die gesamte Hierarchie nur über das Hauptobjekt bearbeiten.

86
Marcin Szymczak

Stellen Sie sich vor, Sie haben eine Computer-Entität. Diese Entität kann auch nicht ohne ihre Software- und Hardware-Entität leben. Diese bilden das Aggregat Computer, das Mini-Ökosystem für den Computer-Teil der Domäne.

Aggregate Root ist die Mutterschiff-Entität innerhalb des Aggregats (in unserem Fall Computer). Es ist üblich, dass Ihr Repository nur mit den Entitäten arbeitet, die Aggregate Roots sind, und diese Entität ist für die Initialisierung der anderen Entitäten verantwortlich .

Betrachten Sie Aggregate Root als Einstiegspunkt für ein Aggregat.

Im C # -Code:

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 {}

Beachten Sie, dass Hardware wahrscheinlich auch ein ValueObject ist (keine eigene Identität hat). Betrachten Sie es nur als Beispiel.

32

Wenn Sie einen Datenbank-First-Ansatz verfolgen, ist Ihre Gesamtwurzel normalerweise die Tabelle auf der 1-Seite einer 1-Many-Beziehung.

Das häufigste Beispiel ist eine Person. Jede Person hat viele Adressen, eine oder mehrere Gehaltsabrechnungen, Rechnungen, CRM-Einträge usw. Dies ist nicht immer der Fall, aber 9/10 Mal.

Wir arbeiten derzeit an einer E-Commerce-Plattform und haben im Grunde zwei gemeinsame Wurzeln:

  1. Kunden
  2. Verkäufer

Kunden geben Kontaktinformationen an, wir weisen ihnen Transaktionen zu, Transaktionen erhalten Werbebuchungen usw.

Verkäufer verkaufen Produkte, haben Ansprechpartner, über uns Seiten, Sonderangebote usw.

Diese werden vom Kunden- bzw. Verkäufer-Repository verwaltet.

13

Von einem defekter Link :

Innerhalb eines Aggregats gibt es eine Aggregatwurzel. Der Aggregatstamm ist die übergeordnete Entität für alle anderen Entitäten und Wertobjekte im Aggregat.

Ein Repository arbeitet mit einem aggregierten Stamm.

Weitere Informationen finden Sie auch hier .

8
Otávio Décio

Dinah:

Im Kontext eines Repositorys ist der aggregierte Stamm eine Entität ohne übergeordnete Entität. Es enthält null, ein oder mehrere untergeordnete Elemente, deren Existenz von der Identität des übergeordneten Elements abhängig ist. Das ist eine Eins-zu-Viele-Beziehung in einem Repository. Diese untergeordneten Entitäten sind einfache Aggregate.

enter image description here

8
Ibrahim Malluf

Aggregat bedeutet Sammlung von etwas.
root ist wie der oberste Baumknoten, von dem aus wir auf alles zugreifen können, wie <html> Knoten im Webseitendokument.
Blog-Analogie, Ein Benutzer kann viele Posts haben und jeder Post kann viele Kommentare haben. Wenn wir also einen Benutzer abrufen, kann dieser als root fungieren, um auf alle verwandten Posts und weiteren Kommentare dieser Posts zuzugreifen. Diese werden alle zusammen als Sammlung oder aggregiert bezeichnet

5
palash140

Aggregat ist der Ort, an dem Sie Ihre Invarianten schützen und die Konsistenz erzwingen, indem Sie den Zugriff auf das aggregierte Stammverzeichnis beschränken. Vergessen Sie nicht, dass Aggregate nach den Geschäftsregeln und Invarianten Ihres Projekts erstellt werden sollten, nicht nach der Datenbankbeziehung. Sie sollten kein Repository injizieren und keine Abfragen sind nicht zulässig.

In Erlang besteht keine Notwendigkeit, zwischen Aggregaten zu unterscheiden, wenn das Aggregat aus Datenstrukturen innerhalb des Staates besteht, anstatt aus OO Zusammensetzung. Siehe ein Beispiel: https: // github .com/bryanhunter/cqrs-with-erlang/tree/ndc-london

0
Henry H.