2013-08-06 5 views
6

Wer sollte für die Verarbeitung von Domänenereignissen verantwortlich sein? Anwendungsdienste, Domain-Services oder Entitäten selbst?In DDD, wer sollte für die Behandlung von Domain-Events verantwortlich sein?

Lassen Sie uns ein einfaches Beispiel für diese Frage verwenden.

Nehmen wir an, wir arbeiten an der Shop-Anwendung, und wir haben einen Anwendungsservice für Bestellvorgänge. In dieser Anwendung Order ist eine aggregierte Wurzel und folgende Regeln, wir können nur mit einem Aggregat innerhalb einer einzigen Transaktion arbeiten. Nachdem die Bestellung aufgegeben wurde, wird sie in einer Datenbank gespeichert. Aber es gibt noch mehr zu tun. Zuerst müssen wir die Anzahl der im Inventar verfügbaren Artikel ändern und zweitens einen anderen Teil eines Systems (wahrscheinlich einen anderen beschränkten Kontext) benachrichtigen, dass der Versandvorgang für diesen bestimmten Auftrag gestartet werden sollte. Da, wie bereits erwähnt, nur ein Aggregat innerhalb einer Transaktion geändert werden kann, denke ich über die Veröffentlichung OrderPlacedEvent nach, die von einigen Komponenten in den separaten Transaktionen verarbeitet wird.

Frage: Welche Komponenten sollten mit dieser Art von Ereignis umgehen?

Antwort

6

möchte ich mag:

1) Anwendungsschicht, wenn das Ereignis Änderung eines anderen Aggregate im gleichen beschränkten Kontext auslöst.

2) Anwendungsschicht, wenn das Ereignis einen Infrastrukturdienst auslöst.

z.B. Eine E-Mail wird an den Kunden gesendet. Daher wird ein Anwendungsdienst benötigt, um die Reihenfolge für den Mail-Inhalt und die E-Mail-Adresse zu laden und dann den Infrastruktur-Service zum Senden der E-Mail aufzurufen.

3) Ich bevorzuge einen Domain Service persönlich, wenn das Ereignis einige Operationen in einem anderen begrenzten Kontext auslöst.

z.B. Versand oder Abrechnung, eine Infrastrukturimplementierung des Domain Service ist dafür verantwortlich, andere beschränkte Kontexte zu integrieren.

4) Infrastrukturschicht, wenn das Ereignis auf mehrere Verbraucher aufgeteilt werden muss. Der Verbraucher geht zu 1), 2) oder 3).

Für mich ist die Schlussfolgerung Anwendungsschicht, wenn das Ereignis zu einem separaten Akzeptanztest für Ihren beschränkten Kontext führt.

Übrigens, wie ist Ihre Infrastruktur, um die Haltbarkeit Ihrer Veranstaltung zu gewährleisten? Nehmen Sie die Veröffentlichung des Ereignisses in die Transaktion auf?

+0

Danke für die Antwort. In Bezug auf die Haltbarkeit - ich weiß noch nicht, wie man es organisiert. Ich denke, im Idealfall sollten wir zwei Transaktionen haben und eine dauerhafte Warteschlange (JMS?) - Ereignis wird innerhalb der gleichen Transaktion veröffentlicht und so stellen wir sicher, dass es ordnungsgemäß zugestellt wurde und die andere Transaktion gestartet wird, wenn die Nachricht aus der Warteschlange abgeholt wird. Auf diese Weise können wir sicherstellen, dass das Ereignis erneut zugestellt wird, wenn etwas schief geht –

2

Diese Art von Handlern gehört zur Anwendungsschicht. Sie sollten wahrscheinlich auch die Methode eines unterstützenden Anwendungsdienstes erstellen. Auf diese Weise können Sie eine separate Transaktion starten.