2016-06-17 8 views

Antwort

0

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).

+0

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

0

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.

+1

"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? –

+0

Ich nehme an, bstrack bedeutet "Domain-Business-Logik" – Khronos

4

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.

Verwandte Themen