DDD: Aggregat Wurzel Frage
-
16-09-2019 - |
Frage
Nehmen wir an, ich habe zwei Entitäten - Foo und Bar. Foo ist ein Aggregat Wurzel und enthält Bar. Soweit ich verstehe, sollte es so aussehen:
public class Foo{
private readonly Bar Bar;
}
Ich möchte Funktionalität für Benutzer bereit, aus einer definierten Liste Bars für Foos zu wählen (und ändern Sie es).
Wenn Repositories soll für Aggregat Wurzeln sein nur bedeutet es, dass es kein Endlager für Bar Einheit sein.
Das führt zu Problem - Bar können nicht unabhängig voneinander zu Foo ohne Referenz erstellt / aktualisiert werden.
Heißt das, dass Bar sollte einen Repository haben, trotz dass es ohne Foo keine Bedeutung hat?
Lösung
Wenn Sie aus einer Liste von Bars auswählen möchten, wo sie nicht mit Foo verbunden sind, dann ist dies nicht ein Aggregat Wurzel. Zum Beispiel können Sie nicht Liste der Orderitem ohne ihren Auftrag bekommen, so ist diese einzige Aggregat Wurzel (Order), aber Sie können die Liste der Produkte erhalten zu Orderitem zuweisen, so Produkt nicht Teil der Ordens Aggregat Wurzel ist.
Beachten Sie, dass während OrderItem Teil der Ordnung Aggregat Wurzel ist, können Sie noch erstellen und unabhängig aktualisieren. Aber, können Sie es nicht ohne Bezug bekommen zu bestellen. Das gleiche gilt für Ihre Bar, auch wenn es einen Teil von Foo war, konnte man jeweils (Foo.Bars) erhalten und mit ihm arbeiten will, oder Foo.AddBar (neue Bar ()). Aber wenn Sie Liste erhalten müssen ohne Foo, Bar ist nicht Teil der Foo Aggregat. Es ist eine separate Einheit.
Nun, das ist, wie ich DDD hier zu sehen, aber ich bin nicht Eric Evans, natürlich.
Andere Tipps
Die Gründe dafür, dass Aggregate Wurzeln sind:
- Sie bieten kontrolliert und gerichtet Zugriff auf zusammengesetzte Entitäten
- Sie können Regeln durchsetzen, um sicherzustellen, dass das gesamte Aggregat gilt
Meine Meinung:
Wenn Sie Bar
Objekte ohne Foo
, auswählen müssen verwenden, um eine BarRepository
.
Aber ...
Was passiert, wenn Sie eine Bar
aktualisieren, und es bricht eine Gültigkeitsregel für das Mutter Foo
ist? Wenn dies passieren könnte, sollten Sie Bar
Zugriff über das Mutter Foo
ist.
Wenn Sie jedoch müssen eine Reihe von Bar
Objekte (zB für einen Batch-Job oder einen Bericht) zuzugreifen, und Sie wissen , dass Foos
nicht kaputt gehen wird, gehen Sie vor und greifen Sie über BarRepository
.
Beachten Sie, dass Aggregat Wurzeln von anderen Aggregate Wurzeln bestehen. Sie können feststellen, dass Bar
ein Aggregat Wurzel selbst, Sie Rechtfertigung für eine BarRepository
geben:)
Sind Sie sicher, dass Bar benötigt eine Einheit sein? Haben Sie das Bedürfnis haben, um es zu verfolgen und sie in der Domäne ändern? Wenn man es als Wertobjekt aussehen kann, würde ich vorschlagen, dass Sie es von einem Dienst holen und dann auf „Verbinden“, um den ausgewählten Wert Objekt an die Foo Einheit. Für Momente durch eine Drop-Down-Liste aus.