Frage

Ich bin auf der Suche, um zu sehen, welche Ansätze Menschen genommen haben könnten Veränderungen in Einheiten zu erkennen, dass ein Teil ihrer Aggregate sind. Ich habe etwas, das funktioniert, aber ich bin nicht verrückt danach. Im Grunde genommen mein Repository ist verantwortlich für die Bestimmung, ob der Zustand eines Aggregats Wurzel verändert hat. Nehmen wir an, dass ich ein Aggregat Wurzel genannt Book haben und eine Einheit Page innerhalb des Aggregats genannt. Ein Book enthält eine oder mehrere Page Einheiten, in einer Pages Sammlung gespeichert.

In erster Linie einfügen vs. Update-Szenarien durchgeführt werden, indem die Gesamt Wurzel und ihre Beschaffungsstellen Inspektion die Anwesenheit eines Schlüssels zu bestimmen. Wenn der Schlüssel vorhanden ist, wird davon ausgegangen, dass das Objekt war, zu einer Zeit, zu der zugrunde liegenden Datenquelle gespeichert. Dies macht es ein Kandidat für ein Update; aber es ist nicht endgültig auf der Grundlage dieser allein für die Entitäten. Mit dem Aggregat Wurzel offensichtlich die Antwort ist, da es nur eine ist, und es ist die einzigartige Einstiegspunkt kann davon ausgegangen werden, dass wichtige Präsenz den Betrieb diktieren. Es ist ein akzeptables Szenario, in meinem Fall, das Aggregat Wurzel zu speichern selbst wieder zurück, so dass ich ein Änderungsdatum erfassen kann.

Um dieses Verhalten für die Entitäten helfen erleichtern sich, meine EntityBase Klasse enthält zwei einfache Eigenschaften: IsUpdated(), IsDeleted(). Diese beiden Standards auf false gesetzt. Ich brauche nicht zu wissen, ob es neu ist oder nicht, weil ich diese Bestimmung auf das Vorhandensein des Schlüssels auf Basis machen kann, wie zuvor erwähnt. Die Verfahren zur Durchführung, in diesem Fall ist die Seite, würde jede Methode, die die Unterstützung Datensatz IsUpdated() auf true ändert.

So, zum Beispiel, hat Seite eine Methode namens UpdateSectionName(), die den Trägerwert der SectionName Eigenschaft ändert, die schreibgeschützt ist. Dieser Ansatz wird durchweg verwendet, da es für einen logischen Ansetzstelle validators in dem Verfahren (Verhinderung der Entität aus der Eingabe einer ungültigen Zustand) ermöglicht es, dass diese Dateneinstellung durchführt. Das Endergebnis ist, dass ich ein this.IsUpdated() = true; am Ende des Verfahrens zu setzen habe.

Wenn das Aggregat Wurzel in das Repository für die Save() gesendet wird (ein Logikschalter entweder zu einem Insert() oder Update() Betrieb), kann er dann über die Pages Sammlung im Book iterieren, für alle Seiten sucht, der eine von drei Szenarien :

  1. Keine Taste. Ein Page ohne Schlüssel eingefügt wird.
  2. IsDeleted = true; A löschen Trümpfe ein Update, und die Löschung verpflichtet werden -. Für die Page jede Aktualisierung ignorieren
  3. IsUpdated = true; Ein Update wird für die Seite begangen werden.

es zu tun auf diese Weise verhindert, dass mich einfach blind alles zu aktualisieren, die in den Seiten-Sammlung ist, das erschreckend sein könnte, wenn es in dem Buch, mehrere hundert Seite Einheiten waren zum Beispiel. Ich hatte in Anbetracht wurde eine Kopie des Buchs Abrufen und einen Vergleich zu tun und nur zu begehen Änderungen erkannt, (Einfügungen, Aktualisierungen und Löschungen, basierend auf Vorhandensein und / oder Vergleich), aber es schien ein schrecklich gesprächig Weg zu gehen, darüber zu sein, .

Der größte Nachteil ist, dass der Entwickler in jeder Methode in der Einheit zu setzen IsUpdated zu erinnern hat. Vergessen Sie ein, und es wird für diesen Wert nicht ändert erkennen können zu. Ich habe mit der Idee von einer Art eines benutzerdefinierten Sicherungsspeichers toyed das könnte transparent Zeitstempel ändert, was wiederum könnte IsUpdated eine schreibgeschützte Eigenschaft machen, dass das Repository zu aggregieren Updates nutzen könnte.

Das Repository einer Arbeitseinheit Muster Implementierung verwendet, die seine Aktionen auf dem Zeitstempel erzeugt wird, zu stützen, wenn das Aggregat Wurzel wurde hinzugefügt. Da könnte es für den Betrieb der Warteschlange mehrere Personen sein, sind Unternehmen Operationen aufgerollt und imme ausgeführttelbar nach dem Aggregat Wurzel Operation (en) ausgeführt werden, dass die Einheiten gehören. Ich konnte sehen, noch einen Schritt weiter und Schaffung einer anderen Einheit der Arbeit nehmen, nur die Einheit Operationen handhaben und sie von der Basis eine Art von Ereignis in der Einheit verwendet Tracking (das ist, wie ich gehe davon aus, dass einige der ORM Produkte auf dem Markt zu erreichen ein ähnliches Maß an Funktionalität).

Bevor ich in dieser Richtung in Bewegung bleiben, aber ich würde gerne Ideen / Empfehlungen / Erfahrungen in Bezug auf das hören.

Edit: Ein paar zusätzlichen Stücke von Informationen, die hilfreich sein könnte wissen:

  1. Die aktuelle Sprache, die ich arbeite mit C #, obwohl ich so viel sprachspezifische Informationen wie möglich zu halten versucht, weil dies eher eine theoretische Diskussion ist.
  2. Der Code für die Repositories / services / Einheiten / etc. auf Tim McCarthy Konzept in seinem Buch basiert ".NET Domain-Driven Design mit C #" und der Unterstützung Code auf CodePlex . Es bietet ein lauffähiges Verständnis für die Art von Ansatz, obwohl das, was ich arbeite mit weitgehend von Grund auf neu geschrieben wurde.
War es hilfreich?

Lösung

Kurz gesagt, meine Antwort ist, dass ich mit ging, was habe ich vorgeschlagen. Es funktioniert, obwohl ich sicher bin, dass es Raum für Verbesserungen. Die Änderungen wurden tatsächlich nur sehr wenig Zeit, so dass ich glaube, ich nicht zu weit in diesem Fall von den KISS oder YAGNI Prinzipien habe zu navigieren. : -)

Ich fühle mich immer noch, dass es Raum für Zeitfragen auf Operationen, aber ich soll um sie herum in den Repository-Implementierungen arbeiten kann. Nicht die ideale Lösung, aber ich bin nicht sicher, dass es sich lohnt, das Rad neu erfinden, ein Problem zu beheben, die in kürzerer Zeit vermieden werden kann, als es zu beheben dauert.

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