Domain Services 

Ist Domänenlogik in einem Usecase Controller vorhanden oder Logik, die nicht so recht in die Aggregate reinpassen, so können Domain Services zur Extraktion verwendet werden. Domain Services in Schleupen.CS 3.0 kapseln Domänenlogik, die rein auf den Aggregaten, Entitys, Value Objects und Daten externer Services basieren. Das injizieren von Repository- und /oder Gateway-Schnittstellen ist erlaubt.

Sie werden als eigene Klasse implementiert in einem Usecase Controller angebunden und verwenden selber das Domain Model. In Schleupen.CS werden diese dem Domain-Layer zugeschlagen.

Namenskonvention: <TueEtwas>DomainService

Wann benötigt man einen Domain Service?

Hier gibt es drei Hauptanwendungsfälle:

Immer wenn komplexe fachliche Logik implementiert werden muss, die sich auf mehrere Aggregates bezieht kann die Implementierung von Domain Services in Erwägung gezogen werden.

Bewertung: Alternativ ist es in der Regel möglich, diese Logik in einem Aggregate unter Verwendung eines anderen Aggregates zu implementieren, d.h. das erste Aggregate wird in die Methode des anderen Aggregates gegeben. Für diesen Fall ist ein Domain Service also nur eine alternative Implementierung. Die Bewertung ist ein Trade off: Verwendet man Domain Services, besteht die Gefahr, die Kapselung der Aggregates aufzubrechen, dafür aber die Kopplung der Aggregates zu minimieren. In den meisten Fällen haben wir uns gegen Domain Services entschieden. Zudem muss man aufpassen, dass keine anämischen Modelle entstehen.

Der zweite Anwendungsfall ist der, bei dem man per Service externe Daten und damit verbunden fachliche Logik für die Berechnung benötigt. Diese haben im Usecase Controller nichts verloren und aus Aggregates heraus dürfen Services nicht aufgerufen werden. Somit bieten Domain Services hierzu eine elegante Lösung.

Auch hier gibt es eine alternative Lösungsmöglichkeit: Das Caching der Daten des externen Services und damit verbunden die Logik in Aggregates zu implementieren. Dies ist aber nicht immer sinnvoll möglich!

Ein weiterer Anwendungsfall, bei dem sich Domain Services eignen, ist, wenn die Logik sich nicht gut durch Aggregate abbilden lässt. Das kann beispielsweise sein, wenn der Verlust eines Buches in unserer Bibliotheksverwaltung implementiert werden soll. Dabei muss das Buch aus dem Bestand entfernt werden. Ein BuchBestand-Aggregat mit sehr vielen Bücher wäre ungeeignet, weil diese unter Umständen sehr viele Bücher hatte. Da Aggregate ja vollständig geladen werden sollen, erscheint das hier nicht so sinnvoll. Hier bietet sich dann ein BuchBestandDomainService an, der das Buch aus dem BuchRepository entfernt und das Domain Event BuchAusBestandEntferntDomainEvent auslöst.

Für Domain Services gilt folgende Regel: Ein Domain Service darf kein Status haben!

Details hierzu können in Domain Services vs Application Services nachgelesen werden.

Cookie Consent mit Real Cookie Banner