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?
Antworten:
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.
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.
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.
quelle