Ich versuche mir ein Bild davon zu machen, wie man das Repository-Muster richtig verwendet. Das zentrale Konzept einer aggregierten Wurzel taucht immer wieder auf. Wenn ich sowohl im Web als auch im Stapelüberlauf nach Hilfe für einen aggregierten Stamm suche, finde ich immer wieder Diskussionen darüber und tote Links zu Seiten, die Basisdefinitionen enthalten sollen.
Was ist im Kontext des Repository-Musters eine aggregierte Wurzel?
Antworten:
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 der Sicht eines Aufrufers werden sie automatisch geladen, entweder gleichzeitig mit dem 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 mehrereLineItem
Objekte kapselt . Ihr Client-Code würde dieLineItem
Objekte niemals direkt laden, sondern nur dieOrder
, die sie enthalten. Dies wäre der aggregierte Stamm für diesen Teil Ihrer Domain.quelle
Von Evans DDD:
Und:
Dies bedeutet, dass aggregierte Wurzeln die einzigen Objekte sind, die aus einem Repository geladen werden können.
Ein Beispiel ist ein Modell, das eine
Customer
Entität und eineAddress
Entität enthält. Wir würden niemalsAddress
direkt vom Modell aus auf eine Entität zugreifen, da dies ohne den Kontext eines zugeordneten Modells keinen Sinn ergibtCustomer
. Wir könnten das also sagenCustomer
undAddress
zusammen ein Aggregat bilden und dasCustomer
ist eine aggregierte Wurzel.quelle
Each AGGREGATE has a root
undThe root is the only *member* of the AGGREGATE
- dieses Verb impliziert, dass die Wurzel eine Eigenschaft des Aggregats ist. In allen Beispielen ist es jedoch umgekehrt: Die Wurzel enthält Eigenschaften, die Aggregate sind. Könntest Du das erläutern?Customer
Klasse als aggregierte Wurzel oderCustomer
Instanz betrachtet , um meine Sprache richtig zu machen ?Aggregate Root ist ein komplexer Name für eine einfache Idee.
Grund Idee
Gut gestaltetes Klassendiagramm kapselt seine Interna. Der Punkt, über den Sie auf diese Struktur zugreifen, wird aufgerufen
aggregate root
.Interna Ihrer Lösung können sehr kompliziert sein, aber Benutzer dieser Hierarchie verwenden nur
root.doSomethingWhichHasBusinessMeaning()
.Beispiel
Überprüfen Sie diese einfache Klassenhierarchie
Wie willst du mit dem Auto fahren? Wählte bessere API
Option A (es funktioniert einfach irgendwie):
Option B (Benutzer hat Zugriff auf Klasseninternale):
Wenn Sie der Meinung sind, dass Option A besser ist, dann herzlichen Glückwunsch. Sie bekommen Hauptgrund dahinter
aggregate root
.Der aggregierte Stamm kapselt mehrere Klassen. Sie können die gesamte Hierarchie nur über das Hauptobjekt bearbeiten.
quelle
car
aggregierte Wurzel haben. Sie können auch Situationen wie die in der Zeichnung zulassen. Die richtige Lösung hängt vom Geschäftsmodell der Anwendung ab. Es kann in jedem Fall anders sein.Stellen Sie sich vor, Sie haben eine Computer-Entität. Diese Entität kann auch nicht ohne ihre Software-Entität und Hardware-Entität leben. Diese bilden das
Computer
Aggregat, 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 in ein Aggregat.
Im C # -Code:
Denken Sie daran, dass Hardware wahrscheinlich auch ein ValueObject ist (Sie haben keine eigene Identität). Betrachten Sie es nur als Beispiel.
quelle
where T : IAggregateRoot
- Dieser machte meinen TagWenn Sie einen Datenbank-First-Ansatz verfolgen, ist Ihr aggregierter Stamm 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 grundsätzlich zwei aggregierte Wurzeln:
Kunden geben Kontaktinformationen an, wir weisen ihnen Transaktionen zu, Transaktionen erhalten Werbebuchungen usw.
Verkäufer verkaufen Produkte, haben Kontaktpersonen, über uns Seiten, Sonderangebote usw.
Diese werden vom Kunden- bzw. Verkäufer-Repository erledigt.
quelle
Dinah:
Im Kontext eines Repositorys ist der aggregierte Stamm eine Entität ohne übergeordnete Entität. Es enthält null, eine oder viele untergeordnete Entitäten, deren Existenz hinsichtlich ihrer Identität vom Elternteil abhängt. Das ist eine Eins-zu-Viele-Beziehung in einem Repository. Diese untergeordneten Einheiten sind einfache Aggregate.
quelle
Von einem defekten Link :
Innerhalb eines Aggregats gibt es eine Aggregatwurzel. Der Aggregatstamm ist die übergeordnete Entität aller anderen Entitäten und Wertobjekte innerhalb des Aggregats.
Ein Repository arbeitet mit einem aggregierten Stamm.
Weitere Infos finden Sie auch hier .
quelle
Aggregat bedeutet Sammlung von etwas.
root ist wie der oberste Knoten des Baums, von wo aus wir auf alles zugreifen können, was wie ein
<html>
Knoten im Webseitendokument ist.Blog-Analogie, Ein Benutzer kann viele Beiträge haben und jeder Beitrag kann viele Kommentare haben. Wenn wir also einen Benutzer abrufen, kann dieser als Root fungieren, um auf alle zugehörigen Beiträge und weitere Kommentare dieser Beiträge zuzugreifen. Diese werden alle zusammen als Sammlung oder aggregiert bezeichnet
quelle
Mit Aggregate schützen Sie Ihre Invarianten und erzwingen die Konsistenz, indem Sie den Zugriff auf die Aggregatwurzel einschränken. Vergessen Sie nicht, dass das Aggregat auf den Geschäftsregeln und Invarianten Ihres Projekts basieren sollte, nicht auf der Datenbankbeziehung. Sie sollten kein Repository einfügen und keine Abfragen sind nicht zulässig.
quelle
In Erlang besteht keine Notwendigkeit, zwischen Aggregaten zu unterscheiden, sobald das Aggregat aus Datenstrukturen innerhalb des Zustands anstelle der OO-Zusammensetzung besteht. Siehe ein Beispiel: https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-london
quelle