So wählen Sie aus, ob Sie ein Domänenereignis verwenden oder ob die Anwendungsebene alles orchestrieren soll


27

Ich mache meine ersten Schritte im bereichsorientierten Design, kaufe das Blue Book und alles und sehe drei Möglichkeiten, um eine bestimmte Lösung zu implementieren. Um es kurz zu machen: Ich verwende weder CQRS noch Event Sourcing.

Angenommen, eine Benutzeranforderung wird in die Anwendungsserviceschicht eingegeben. Die Geschäftslogik für diese Anforderung ist (aus welchen Gründen auch immer) in eine Methode für eine Entität und eine Methode für einen Domänendienst unterteilt. Wie soll ich vorgehen, um diese Methoden aufzurufen?

Die Optionen, die ich bisher gesammelt habe, sind:

  • Lassen Sie den Anwendungsdienst beide Methoden aufrufen
  • Verwenden Sie die Methode Injection / Double Dispatch, um den Domänendienst in die Entität zu injizieren, und lassen Sie die Entität das Richtige tun und dann die Methode des Domänendienstes aufrufen (oder umgekehrt, lassen Sie den Domänendienst die Methode für die Entität aufrufen).
  • Löst ein Domänenereignis in der Entitätsmethode aus, dessen Handler den Domänendienst aufruft. (Die Art der Domain-Ereignisse, über die ich spreche, sind: http://www.udidahan.com/2009/06/14/domain-events-salvation/ )

Ich denke, das ist alles machbar, aber ich kann mich nicht zwischen ihnen entscheiden. Ich habe lange darüber nachgedacht und bin zu einem Punkt gekommen, an dem ich die semantischen Unterschiede zwischen den drei nicht mehr sehe. Kennen Sie einige Richtlinien, wann Sie was verwenden sollen?


1
danke für den interessanten link zu den infos zu domain events.
JW01

Müssen diese beiden Methoden in einer bestimmten Reihenfolge aufgerufen werden?
SpaceTrucker

@SpaceTrucker In meinem speziellen Fall ist das eigentlich egal. Aber in jeder der Optionen, die ich selbst erwähnt habe, ist es möglich, die Ausführung der Methoden zu bestellen, wenn man möchte.
DVDVorle

Antworten:


19

Lassen Sie den Anwendungsdienst beide Methoden aufrufen

Der Anwendungsservice ist in der Regel ein guter Ausgangspunkt dafür. Sie sollten jedoch immer versuchen, das Verhalten so nahe wie möglich an die Entität heranzuführen. Der Anwendungsdienst spielt eine orchestrierende Rolle und bereitet die Bühne für die Ausführung des Domänenverhaltens vor und stellt als solche alle erforderlichen Abhängigkeiten bereit. Nach Möglichkeit sollte das Verhalten jedoch an das Domänenmodell delegiert werden.

Verwenden Sie die Methode Injection / Double Dispatch, um den Domänendienst in die Entität zu injizieren, und lassen Sie die Entität das Richtige tun und dann die Methode des Domänendienstes aufrufen (oder umgekehrt, lassen Sie den Domänendienst die Methode für die Entität aufrufen).

Dies ist ein besserer Ansatz, da ein größerer Teil des Verhaltens an die Entität oder den Domänendienst delegiert wird. Die am stärksten entkoppelte Art und Weise, dies zu implementieren, besteht darin, dass eine Entität eine Abhängigkeit von einem Dienst ausdrückt, und zwar als Parameter der Methode, die das vorliegende Verhalten bereitstellt.

Löst ein Domänenereignis in der Entitätsmethode aus, dessen Handler den Domänendienst aufruft.

Das Domänenereignismuster ist, wie von Udi und Evans selbst erläutert, sehr vielseitig und kann in einer Vielzahl von Szenarien angewendet werden. Es gibt jedoch einige Komplikationen, die damit einhergehen. Zunächst müssen Sie sicherstellen, dass der Domain-Event-Publisher über den richtigen Gültigkeitsbereich verfügt. In den meisten Fällen weisen Ihre Domänenereignishandler Abhängigkeiten auf. Wenn Sie einen IoC-Container verwenden, müssen Sie sicherstellen, dass die richtigen Instanzen injiziert werden. Beispielsweise kann in einer Webanwendung die[ThreadStatic]Attribut ist problematisch für das Scoping. Eine andere Komplexität ist die der Transkriptionsgrenzen. Sie müssen Transaktionen berücksichtigen, denn wenn eine Entität ein Domänenereignis auslöst, eine nachfolgende Festschreibung für die Datenbank jedoch fehlschlägt, müssen alle Domänenereignis-Handler einen Rollback durchführen. Andernfalls wird ein ungültiges Ereignis ausgelöst. Wenn Sie jedoch diese Grundlagen abgedeckt haben, sind Domänenereignisse ein hervorragendes Muster für die Kapselung der Domänenlogik in den Entitäten selbst.

Der Unterschied zwischen Ansatz 2 und 3 hängt vom Anwendungsfall ab. Ein Domänenereignis wird angewendet, wenn Sie als Reaktion auf ein Ereignis in der Vergangenheitsform zusätzliche Verhaltensweisen aufrufen möchten . Dies ist eine wichtige Einschränkung, da der Domänenereignishandler das Verhalten der Entität nicht beeinflussen kann. Auf der anderen Seite kann der injizierte Dienst bei Ansatz 2 das Verhalten beeinflussen, da er als Abhängigkeit für dieses bestimmte Verhalten deklariert wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.