Betrachten Sie einen Domain Service als ein Objekt, das Geschäftslogik oder geschäftsregelrelevante Logik auf Domänenobjekten implementiert und diese Logik schwer in die gleichen Domänenobjekte zu integrieren ist und auch keinen Zustandswechsel des Domain Service verursacht (Domain Service ist ein Objekt ohne "Zustand" oder besser gesagt ohne einen Zustand, der eine geschäftliche Bedeutung hat), sondern letztendlich nur den Zustand der Domänenobjekte ändert, auf denen er operiert.
Während ein Anwendungsdienst Logik auf Applikationsebene implementiert, wie Benutzerinteraktion, Eingabevalidierung, Logik, die nicht geschäftsbezogen ist, sondern andere Belange betrifft: Authentifizierung, Sicherheit, E-Mail-Versand usw., beschränkt er sich darauf, einfach die von Domänenobjekten bereitgestellten Dienste zu nutzen.
Ein Beispiel dafür könnte das folgende Szenario sein, das nur zum Erklärungszweck gedacht ist: wir müssen eine sehr kleine domotische Dienstprogramm-App implementieren, die eine einfache Operation ausführt, nämlich "das Licht einschalten, wenn jemand die Tür eines Zimmer eines Hauses öffnet, um einzutreten, und das Licht ausschaltet, wenn die Tür geschlossen wird und man das Zimmer verlässt".
Um es zu vereinfachen, betrachten wir nur 2 Domänenentitäten, die nicht Teil des gleichen Aggregats sind: Tür
und Lampe
, von denen jede 2 Zustände hat, nämlich offen/geschlossen
und an/aus
, und spezifische Methoden zur Durchführung von Zustandsänderungen an ihnen hat. Die Entitäten müssen Teil verschiedener Aggregate sein, so dass die folgende Logik nicht im Wurzelaggregat implementiert werden kann.
In diesem Fall benötigen wir einen Domain Service, der die spezifische Operation durchführt, das Licht einzuschalten, wenn jemand die Tür von außen öffnet, um in ein Zimmer einzutreten, weil die Tür- und Lampenobjekte diese Logik nicht in einer Weise implementieren können, die unserer Geschäftsnatur entspricht. Dieser neue Domain Service muss einige Geschäftsprozesse umschließen, die immer ausgelöst werden sollten, ausgelöst durch einige Domänenereignisse/-methoden.
Wir können unseren Domain Service als DomotikDomainService
bezeichnen und 2 Methoden implementieren: TürÖffnenUndLichtEinschalten
und TürSchließenUndLichtAusschalten
, diese 2 Methoden ändern jeweils den Zustand beider Objekte Tür
und Lampe
in offen/an
und geschlossen/aus
.
Der Zustand des Eintretens oder Verlassens eines Raumes befindet sich nicht im Domain Service-Objekt und auch nicht in den Domänenobjekten, sondern wird als einfache Benutzerinteraktion durch einen Anwendungsdienst implementiert, den wir Hausdienst
nennen können, der einige Ereignishandler wie beiÖffnenDerZimmertürEintreten
und beiSchließenDerZimmertürVerlassen
implementiert, und so weiter für jedes Zimmer (dies ist nur ein Beispiel zum Erklärungszweck...), die jeweils dafür verantwortlich sind, die Methoden des Domain Service aufzurufen, um das gewünschte Verhalten auszuführen (wir haben die Entität Zimmer
nicht berücksichtigt, weil es nur ein Beispiel ist).
Dieses Beispiel, das bei weitem keine gut gestaltete Anwendung der realen Welt ist, hat nur den Zweck (wie bereits mehrmals gesagt), zu erklären, was ein Domain Service ist und wie er sich von einem Anwendungsdienst unterscheidet, hoffentlich ist es klar und nützlich.
Außerdem könnte der obige Beispiel-Domain Service leicht durch Domain-Ereignisse ersetzt werden, die verwendet werden, um explizit Nebeneffekte über ein oder mehrere Aggregate hinweg zu implementieren, aber da diese nicht Gegenstand dieser Frage sind, erwähne ich sie nur hier, damit der Leser sich ihrer Existenz bewusst ist und später entscheiden kann, welche Herangehensweise für sie besser ist.
0 Stimmen
Fühlen Sie sich frei, dies zu überprüfen: youtu.be/MfEpw2WXXyk