2012-10-13 11 views
10

Als Teil meines Domain-Modells, sagen wir, ich habe ein WorkItem Objekt. Das WorkItem Objekt hat mehrere Beziehungen Werte nachzuschlagen, wie:Sollen Lookup-Werte als Aggregatwurzeln modelliert werden?

WorkItemType:

  • User-Story
  • Bug
  • Enhancement

Priority:

  • Hoch
  • Medium
  • Low

Und es möglicherweise sein könnte, wie Status, Severity, etc ...

DDD die besagt, wenn etwas in einem Aggregat Wurzel besteht, dass Sie shouldn Versuchen Sie nicht, außerhalb des aggregierten Stammverzeichnisses darauf zuzugreifen. Wenn ich also neue WorkItemTypes wie Task oder neue Prioritäten wie Critical hinzufügen möchte, müssen diese Lookup-Werte Aggregat-Roots mit ihren eigenen Repositories sein? Dies erscheint etwas übertrieben, besonders wenn es sich nur um ein Schlüsselwertpaar handelt. Wie kann ich zulassen, dass ein Benutzer diese Werte ändert und weiterhin die aggregierte Stammverkapselungsregel erfüllt?

Antwort

6

Landon, ich denke, dass der einzige Weg ist, diese Wertpaare aggregieren Wurzeln zu machen. Ich weiß, dass das vielleicht übertrieben aussieht, aber das ist DDD, das Dinge in kleine Komponenten bremst.

Die Gründe, warum ich ein Repository denke, mit ist der richtige Weg sind:

  • Ein Benutzer muss in der Lage sein, diese Wertepaare unabhängig von einem Work Item hinzuzufügen.
  • Die Wertepaare haben keine lokale, eindeutige Identität

Denken Sie daran, dass DDD nur eine Reihe von Richtlinien, nicht harte Wahrheiten ist. Wenn Sie denken, dass dies ein Overkill ist, möchten Sie möglicherweise eine Suche erstellen, die die Paare als Wertobjekte zurückgibt. Dies kann insbesondere dann funktionieren, wenn Sie keine Funktion zum Hinzufügen von Wertepaaren in der Anwendung, sondern über die Datenbank haben.

Als Randnotiz, gute Frage! Es gibt ziemlich viele Blog-Posts über diese Situationen ... Aber nicht alle sind sich einig über den besten Weg, dies zu tun.

+0

In meinem Fall muss die Anwendung die Lookup-Werte ändern. Ich schätze, dass das Modellieren dieser Objekte als Aggregate sinnvoll erscheint. Vaughn Vernon erklärt, wie diese Aggregate in diesem [Artikel] zusammenarbeiten können (http://dddcommunity.org/sites/default/files/pdf_articles/Vernon_2011_2.pdf). Am Ende von Seite 8 erwähnt er, dass Sie einen Anwendungsdienst haben könnten, um die Abhängigkeiten aufzulösen. Er sagt auch, dass, wenn die Abfragen zu teuer werden, Sie einige CQRS verwenden könnten. –

4

Nicht alles soll mit DDD modelliert werden. Die Komplexität der Verwaltung der Referenzdaten würde es höchstwahrscheinlich nicht rechtfertigen, aggregierte Wurzeln zu bilden. Eine gängige Lösung wäre die Verwendung von CRUD zum Verwalten von Referenzdaten und ein Domänenservice für die Schnittstelle mit den Daten aus der Domäne.

8

Während das Repository-Muster, wie in der blue book beschrieben, seine Verwendung als exklusiv für Aggregate hervorhebt, lässt es Raum für Ausnahmen offen.Um das Buch zu zitieren:

Obwohl die meisten Anfragen ein Objekt oder eine Sammlung von Objekten zurückgeben, es paßt auch in dem Konzept einige Arten von Zusammenfassung Berechnungen zurückzukehren, wie eine Objektzählung oder einer Summe von a numerisches Attribut, das vom Modell bestimmt wurde. (pg. 152)

Dieses besagt, dass ein Repository zusammenfassende Informationen verwendet werden kann, zurückzukehren, die kein Aggregat ist. Diese Idee erstreckt sich auch auf die Verwendung eines Repository zum Nachschlagen von Wertobjekten, genau wie es Ihr Anwendungsfall erfordert.

Eine weitere zu berücksichtigende Sache ist die read-model pattern, die im Wesentlichen einen Nur-Abfrage-Repository-Typ ermöglicht, der das verhaltensreiche Domänenmodell effektiv von Abfrageproblemen entkoppelt.

+0

+1 für den Hinweis, dass ein Repository nicht immer einen aggregierten Root zurückgeben muss. Auch für die Verknüpfung mit dem Lesemodellmuster und Erklärung, wie es sich von CQRS unterscheidet, da es die gleiche Datenbank verwendet. Da meine Anwendung Datenänderungen erfordert und nicht nur Lesevorgänge, habe ich beschlossen, sie zu aggregieren und wahrscheinlich ein Lesemodell oder einen Anwendungsdienst zu verwenden, um die Verknüpfungen zwischen den Aggregaten herzustellen. –

2

Haben diese Lookups IDs? Wenn nicht, könnten Sie sie in Betracht ziehen Value Objects ...

+2

Sie haben IDs und werden von verschiedenen Entitätsinstanzen gemeinsam verwendet, so dass sie keine Wertobjekte sind. –