9

Ich versuche, das Repository-Muster für mein aktuelles Projekt zu verwenden, und ich versuche gerade, die Domäne zu modellieren und die aggregierten Wurzeln zu finden.Aggregatwurzeln. Wie weit reicht das Kaninchenloch?

Ich habe gelesen von der 'Cascading Delete' Regel, die besagt, dass wenn es nicht sinnvoll ist, ein Mitglied zu löschen, wenn der Stamm gelöscht wird, sollte es nicht Teil des Stammes sein.

Ich werde einen Polizei Vorfall als eample verwenden: -

Incident (Aggregat root) - Diese Offiziere untersuchen enthalten könnte, die von jedem Offizier machte sich Notizen. Es könnte auch Verdächtige mit einer Liste von Daten enthalten, die interviewt wurden. Wurde CCTV-Material für den Vorfall erhalten? Ein Protokoll jedes Mal, wenn die CCTV angesehen wurde und von wem? Wurden Kopien von der CCTV für Beweise/Gericht usw.

Es scheint, wie die IncidentAggregate könnte riesig werden, da es scheint, dass alles hängt an diesem Vorfall.

Meine Frage ist zweifach, wie viel sollte die aggregierte Wurzel verwalten und sind Wurzeln in den Wurzeln eine gute Idee?

Dies ist vielleicht kein besonders gutes Beispiel, da Sie wahrscheinlich nie etwas wie einen Polizeivorfall entfernen würden, aber ich hoffe, dass es meine Frage besser beschreibt.

Antwort

10

Ein Aggregat enthält normalerweise Referenzen zu anderen Aggregatwurzeln. Diese Referenzen sollten gelöscht werden, wenn das enthaltende Aggregat gelöscht wird, aber die Aggregate, auf die sie verweisen, bleiben erhalten.

Um Ihre Analogie zu verwenden. Ein Bericht, den wir annehmen, ist ein Teil von nur einem Ereignisaggregat und würde zusammen mit dem Aggregat gelöscht. Kein anderes Aggregat würde direkt auf diese Berichte zugreifen.

Das Ereignis Aggregat würde jedoch Referenz Aggregate, die Offiziere und Verdächtigen, und CCTV Anzeige Protokolle Einträge.

9

Ein Aggregat ist eine Gruppe von Objekten mit demselben Lebenszyklus.

Wenn Sie einen Vorfall gelöscht haben, möchten Sie auch den ermittelnden Beamten löschen? Nein - wenn du das hättest, hättest du bald keine Polizisten mehr. Der ermittelnde Offizier ist nicht im Ereignis-Aggregat.

Von den anderen Dingen, die Sie Liste, Verdächtigen, Interviews, CCTV usw. Die Antwort ist - es kommt darauf an.

Es hängt von Ihrer Problemdomäne ab. Was macht Ihr System? Was ist der Umfang? Welches Problem löst es?

Wenn es nur Aufgabe ist, eine Reihe von Vorfällen zu verfolgen und Verdächtige zu vermuten, Interviews und CCTV sind nur im System als Folge eines einzelnen Vorfalls, dann könnte es ja angebracht sein, alle in einem Aggregat zu haben. Wenn der Vorfall gelöscht wird, können die Verdächtigen, Interviews und CCTV gehen.

Wenn Sie zum Beispiel auch Archive von CCTV-Filmmaterial aus einem Netzwerk von Kameras in der Innenstadt erfassen. Vielleicht versuchen Sie, ihre Effektivität und Zuverlässigkeit zu überwachen. In diesem Fall müssen Sie CCTV-Aufnahmen anders behandeln. Es wäre in einem anderen Aggregat mit einem eigenen Lebenszyklus. Wenn Sie einen Vorfall löschen, möchten Sie Ihr CCTV-Filmmaterial weiterhin für andere Vorfälle und Leistungsmesswerte aufbewahren.

Was in und aus einem Aggregat ist hängt von Ihrer Problemdomäne ab. Oder genauer, es hängt davon ab, wie Sie die Problemdomänenlösung modelliert haben.

Denken Sie Lebenszyklus.

1

"Sind Wurzeln in Wurzeln eine gute Idee?"

Kurze Antwort meiner Meinung nach ist nein. Wie Kurt sagt, sollten Sie Referenzen auf andere Aggregate halten. Nur um klar zu sein, mit Referenzen meine ich Objekte zu identifizieren. Also vielleicht Ihr Vorfall Aggregat würde eine Eigenschaft haben, wie

public IEnumerable<Guid> InvestigatingOfficerIds 
{ 
    get { return _investigatingOfficerIds.AsReadOnly(); } 
} 

Oder

public IEnumerable<OfficerReference> InvestigatingOfficerIds 
{ 
    get { return _investigatingOfficerIds.AsReadOnly(); } 
} 

Wodurch OfficeReference ist eine Klasse, die den Wert eines Beamten Identität darstellt (unter der Haube wahrscheinlich ein Guid wäre).

Wenn Ihre Domänenlogik Aktionen sowohl mit dem Vorfall als auch mit den Ermittlungsbeamten ausführen müsste, würden Sie diese Logik zu einem Domänenservice abstrahieren und mithilfe des IOfficerRepository die Offizieraggregate mithilfe der im Vorfallaggregat bereitgestellten IDs abrufen.