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?

War es hilfreich?

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:

  1. Sie bieten kontrolliert und gerichtet Zugriff auf zusammengesetzte Entitäten
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top