DDD: Roots aggregieren

Ich brauche Hilfe beim Finden meiner Gesamtwurzel und -grenze.

Ich habe 3 Entitäten: Plan, PlannedRole und PlannedTraining. Jeder Plan kann viele PlannedRoles und PlannedTrainings enthalten.

Lösung 1: Zuerst dachte ich, Plan sei die Gesamtwurzel, weil PlannedRole und PlannedTraining im Kontext eines Plans keinen Sinn ergeben. Sie sind immer in einem Plan. Wir haben auch eine Geschäftsregel, die besagt, dass jeder Plan maximal 3 PlannedRoles und 5 PlannedTrainings haben kann. Ich dachte also, ich könnte diese Invariante erzwingen, indem ich den Plan als Gesamtwurzel nenne.

Wir haben jedoch eine Suchseite, auf der der Benutzer nach Plänen sucht. Das Ergebnis zeigt einige Eigenschaften des Plans selbst (und keine seiner PlannedRoles oder PlannedTrainings). Ich dachte, wenn ich das gesamte Aggregat laden müsste, hätte es viel Overhead. Es gibt fast 3000 Pläne und jeder kann ein paar Kinder haben. Das gleichzeitige Laden all dieser Objekte und das Ignorieren von PlannedRoles und PlannedTrainings auf der Suchseite macht für mich keinen Sinn.

Lösung 2: Ich habe gerade festgestellt, dass der Benutzer zwei weitere Suchseiten haben möchte, auf denen er nach geplanten Rollen oder geplanten Schulungen suchen kann. Dadurch wurde mir klar, dass sie versuchen, unabhängig und "außerhalb" des Plans auf diese Objekte zuzugreifen. Also dachte ich, ich hätte mich bei meinem anfänglichen Design geirrt, und so kam ich zu dieser Lösung. Also dachte ich, ich hätte 3 Aggregate hier, 1 für jede Entität.

Dieser Ansatz ermöglicht es mir, unabhängig nach jeder Entität zu suchen und das Leistungsproblem in Lösung 1 zu beheben. Mit diesem Ansatz kann ich die zuvor erwähnte Invariante jedoch nicht erzwingen.

Es gibt auch eine andere Invariante, die besagt, dass ein Plan nur geändert werden kann, wenn er einen bestimmten Status hat. Daher sollte es mir nicht möglich sein, einem Plan, der sich nicht in diesem Status befindet, PlannedRoles oder PlannedTrainings hinzuzufügen. Auch hier kann ich diese Invariante mit dem zweiten Ansatz nicht erzwingen.

Jeder Rat wäre sehr dankbar.

Cheers, Mosh

Antworten auf die Frage(3)

Ihre Antwort auf die Frage