614 Stimmen

Was ist eine Aggregatwurzel?

Ich versuche zu verstehen, wie man das Repository-Muster richtig einsetzt. Das zentrale Konzept einer Aggregatwurzel taucht immer wieder auf. Wenn ich im Web und bei Stack Overflow nach Hilfe suche, was eine Aggregatwurzel ist, finde ich immer wieder Diskussionen über sie und tote Links zu Seiten, die Basisdefinitionen enthalten sollen.

Im Zusammenhang mit dem Repository-Muster, was ist eine aggregierte Wurzel?

430voto

Jeff Sternal Punkte 46528

Im Kontext des Repository-Patterns sind die Aggregatwurzeln die einzigen Objekte, die Ihr Client-Code aus dem Repository lädt.

Das Repository kapselt den Zugriff auf untergeordnete Objekte - aus Sicht des Aufrufers werden sie automatisch geladen, entweder zum gleichen Zeitpunkt, zu dem der Root geladen wird, oder wenn sie tatsächlich benötigt werden (wie beim "Lazy Loading").

Sie könnten zum Beispiel eine Order Objekt, das Vorgänge auf mehreren Ebenen kapselt LineItem Objekte. Ihr Client-Code würde niemals die LineItem Objekte direkt, nur die Order der sie enthält, was der aggregierte Root für diesen Teil Ihrer Domäne wäre.

284voto

jason Punkte 227577

Von Evans DDD:

Ein AGGREGATE ist eine Gruppe zusammengehöriger Objekte, die wir für die Zwecke von Datenänderungen als Einheit behandeln. Jedes AGGREGATE hat eine Wurzel und eine Begrenzung. Die Begrenzung definiert, was sich innerhalb des AGGREGATEs befindet. Die Wurzel ist eine einzelne, spezifische ENTITÄT, die im AGGREGATE enthalten ist.

Und:

Die Wurzel ist das einzige Mitglied von AGGREGATE, auf das externe Objekte verweisen dürfen.

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

Ein Beispiel ist ein Modell, das eine Customer Unternehmen und ein Address Unternehmen. Wir würden niemals auf eine Address Entität direkt aus dem Modell, da sie ohne den Kontext einer assoziierten Entität keinen Sinn ergibt. Customer . Wir könnten also sagen, dass Customer y Address zusammen ein Aggregat bilden und dass Customer ist ein Aggregat Root.

191voto

Marcin Szymczak Punkte 10413

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


Allgemeine Idee

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

enter image description here

Die Interna Ihrer Lösung können sehr kompliziert sein, aber die Benutzer dieser Hierarchie werden einfach die root.doSomethingWhichHasBusinessMeaning() .


Prüfen Sie diese einfache Klassenhierarchie enter image description here

Wie wollen Sie Ihr Auto fahren? Wählen Sie eine bessere API

Option A (es funktioniert einfach irgendwie):

car.ride();

Option B (Benutzer hat Zugang zu den inneren Werten der Klasse):

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

Wenn Sie denken, dass Option A besser ist, dann herzlichen Glückwunsch. Sie haben den Hauptgrund für aggregate root .


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

47voto

Francisco Aquino Punkte 8987

Stellen Sie sich vor, Sie haben einen Computer. Auch dieser kann nicht ohne seine Software- und Hardware-Entität leben. Diese bilden die Computer Aggregat, das Mini-Ökosystem für den Computerteil des Bereichs.

Aggregatwurzel ist das Mutterschiff innerhalb des Aggregats (in unserem Fall Computer ), ist es gängige Praxis, dass Ihr Repository nur mit den Entitäten arbeitet, die Aggregatwurzeln sind, und dass diese Entität für die Initialisierung der anderen Entitäten verantwortlich ist.

Betrachten Sie die Aggregatwurzel als Einstiegspunkt in ein Aggregat.

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

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

21voto

palash140 Punkte 593

Aggregat bedeutet Sammlung von etwas.
Wurzel ist wie der oberste Knoten des Baumes, von dem aus wir auf alles zugreifen können, wie <html> Knoten im Webseitendokument.
Blog-Analogie, ein Benutzer kann viele Beiträge und jeder Beitrag kann viele Kommentare haben. so, wenn wir einen Benutzer holen dann kann es als handeln Wurzel um auf alle zugehörigen Beiträge und weitere Kommentare zu diesen Beiträgen zuzugreifen. Diese werden alle zusammen als Sammlung oder Aggregiert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X