Wo sollte ich Felder wie CreatedDate, CreatedBy, ModifiedDate, ModifiedBy festlegen? Soll ich den aktuellen Benutzerkontext an das Repository übergeben und dort einstellen oder ist es vielleicht besser, ihn im Anwendungsdienst zu setzen (aber dann muss dies in jeder API-Methode geschehen und nicht nur in Hinzufügen/Aktualisieren im Repository)?DDD: Wo sollte ich das Änderungsdatum einstellen und um? Repository oder Anwendungsdienst?
Antwort
Ich bevorzuge es, sie im Repository zu setzen. Fügen Sie einen Parameter in die vorhandene add/update-Methode mit dem Namen int operatorId
oder etwas Ähnliches ein.
Wenn Sie den Code in den Anwendungsdienst eingeben, müssen Sie sich immer wiederholen. Und wenn Sie vergessen, einige Werte zu setzen, werden Ausnahmen ausgelöst, wenn Änderungen gespeichert werden (manchmal sogar noch schlimmer, keine Ausnahmen, sondern schmutzige Daten).
Wir setzen Entitätsstatus immer innerhalb von Anwendungsdiensten. Repositories dienen zum Speichern von Daten, sie sollten keine Logik enthalten. Die Domänenentität wird im Anwendungsdienst erstellt/geändert. Daher legen Sie diese Felder fest. Die Erstellungs-/Änderungsdaten sollten nicht reflektieren, wann die Entität in der Datenbank gespeichert wurde, sondern eher, wenn die Entität tatsächlich gespeichert/geändert wurde.
Wir finden auch, dass wir normalerweise unsere Domain-Entitäten auf Data-Layer-Entitäten abbilden müssen, um mit der zugrunde liegenden Datenbanktechnologie freundlicher zu sein. Wir verwenden oft Tools wie Auto-Mapper, um diese Mappings zu automatisieren. Wenn Felder in einer Entität vorhanden sind, die in ihrer Datenentitätsäquivalent nicht vorhanden ist, wird unnötige Komplexität hinzugefügt.
"Repositories dienen zum Speichern von Daten, sie sollten keine Logik enthalten". Sie denken, ein 'StudentRepository' hat eine Methode mit dem Namen' GetStudents (int grade) ' weil es die Logik hat, Schüler nach ihrer Note zu bekommen? –
Ich nehme an, bstrack bedeutet "Domain-Business-Logik" – Khronos
Es hängt von Ihrer Domäne ab.
Wenn Werte wie CreatedDate
, CreatedBy
... zum Verfolgen oder Protokollieren Zweck sind, dann würde ich sie in die Infrastructure
(Repository) setzen.
Auf der anderen Seite, wenn diese Werte aus irgendeinem Grund zu meiner Domäne gehören, dann würde ich sie in der Domain-Ebene platzieren.
Beispiel: Abbildung, dass ein Kunde in einem Banking-Transfer-Kontext eine Übertragung nur bis 24 Stunden nach der Übermittlung zur Abrechnung abbrechen konnte. Dann benötigt die Domäne CreateTransferDate
, um die Invarianten zu erfüllen.
Eine andere Option könnte ein Listener sein, der alle Domain-Ereignisse konsumiert und historische Zeitdaten von dem speichert, was passiert.
Wir erlauben niemals, dass sich die Entitäten in einem ungültigen Zustand befinden. Wir tun dies, indem wir Design durch Vertragsprüfungen durchsetzen (Vorbedingungen, Invarianten und Postbedingungen, wo zutreffend). Auf diese Weise stellen Sie sicher, dass niemand "vergessen" kann, Werte zu setzen. – bstack