DDD: Wo werden Domain Event Handler platziert?

13

Können Sie mir Ihre Meinung sagen, welche Ebene die richtige ist, um Domain-Event-Handler in DDD zu platzieren? Ich habe beispielsweise einen Anwendungsdienst zum Hinzufügen eines neuen Vertrags und möchte eine E-Mail-Benachrichtigung an die Kontaktperson senden, wenn der Vertrag hinzugefügt wurde. Dies gilt auch für den Anwendungsdienst oder den Domänendienst des E-Mail-Absenders (der das Ereignis ContractAdded behandelt) oder etwas anderes?

Toni
quelle

Antworten:

11

Ich platziere Domain Event Handler in der Anwendungsschicht.

Das Domänenereignis ist eine Möglichkeit, den Außenschichten (oder der Außenwelt) mitzuteilen, dass in der Domänenschicht etwas passiert ist. Was mit dem Ereignis zu tun ist, hängt von der Anwendung ab. Die Anwendung benachrichtigt den Benutzer möglicherweise über Änderungen oder ruft eine andere Domäne an, um etwas zu tun. Die Anwendung ist für die Orchestrierung von Domänenvorgängen als Reaktion auf Benutzeraktionen, Webanforderungen oder Domänenereignisse verantwortlich.

Eugene Khudoy
quelle
1
+1 für die Anwendungsschicht. In einem Pub-Sub-Design kann das Domänenereignis generische Logik an verschiedenen Orten / Systemen / Mikrodiensten aktivieren. Wenn einer der Abonnenten eine mit DDD modellierte Anwendung ist, löst das Ereignis eine Verarbeitung in dieser Anwendung / BC aus. Diese Verarbeitung kann eine Transaktionsabgrenzung, Zugriffskontrolle und Koordination erfordern, die typischerweise auf der Anwendungsschicht durchgeführt werden.
Paulo Merson
2

Das ursprüngliche DDD-Buch (Evans 2004) erklärt die Anwendungsschicht als eine dünne Schicht, die Domänenobjekte als Reaktion auf die Aktion des Benutzers ausübt. Typische Ereignishandler für Domänenereignisse gehören daher nicht zur Anwendungsschicht.

Es kann sinnvoll sein, einige davon in der Domänenschicht zu platzieren, solange Sie die Schicht nicht durch Erstellen einer Abhängigkeit nach oben unterbrechen.

Wenn Sie eine Infrastrukturschicht haben, die sich unterhalb der Domänenschicht befindet, kann der Ereignishandler nicht vorhanden sein, da dies die Schichtung unterbrechen würde.

Wenn Sie eine Adapterschicht haben, die sich über der Domänenschicht befindet, können Sie dort eine Ereignisbehandlungsroutine erstellen. Schauen Sie sich die hexagonale Architektur an .

Gudmundur Orn
quelle
2

Ich platziere Domain Event Handler in der Domain-Ebene als Domain-Schnittstelle IDomainEventHandler.

Ein Beispiel für einen Domänenereignishandler ist eine Richtlinie, die ein bestimmtes Domänenereignis abonniert, um eine neue Transaktion zu initialisieren (z. B. um einen neuen Domänenbefehl auszulösen). Daher ist es sinnvoll, sie in der Domänenschicht zu haben, da sie mit dieser verbunden ist Geschäftslogik.

Wir könnten uns ein Beispiel vorstellen, bei dem eine Bestellung bestätigt wird und daher eine Rechnungsanforderung erstellt werden sollte. Wir haben ein Ereignis OrderConfirmedEvent, das passiert ist. Eine Richtlinie in unserer Domäne ist dafür verantwortlich, dieses Ereignis zu abonnieren und einen Domänenbefehl zu RequestInvoiceerstellen, der vom Befehlshandler verarbeitet und entsprechend behandelt wird.

Wenn wir diesen Ereignishandler in der Anwendungsschicht hätten, würde dies bedeuten, dass die Anwendungsschicht zusätzlich zur Orchestrierung der Benutzeraktionen eine Geschäftslogik ausführen würde, was falsch erscheint.

Wir haben es jedoch

diegosasw
quelle