In Domain Driven Design kann die Domänenschicht mehrere (traditionelle) Dienste haben. Für die Benutzerdomäne haben wir beispielsweise Folgendes:
- Eine UserFactory, die Benutzerobjekte auf unterschiedliche Weise erstellt
- Ein UserRepository, das für die Interaktion mit den Persistenzdiensten in der Infrastrukturschicht verantwortlich ist
Ist ein UserService in der Domänenschicht lediglich ein Vermittler und / oder eine Fassade für diese beiden Dienste und die Infrastrukturschicht, oder steckt mehr dahinter?
Antworten:
Domain services
werden am besten durch das beschrieben, was sie nicht sind:Entities
nochAggregate roots
Value objects
Entity
oder einem passtValue object
Ein Beispiel für a
Domain service
ist aSaga/Process manager
: Es koordiniert einen lang laufenden Prozess, an dem mehrere beteiligt sindAggregate roots
, die von verschiedenen möglich sindBounded contexts
.Abgesehen davon sind das, was ein ist
Domain service
und wie es implementiert wird, zwei orthogonale Dinge.Einige Domänendienste wie a
UserRepository
(bestehend aus einer in derDomain layer
und einer konkreten Implementierung in der definierten SchnittstelleInfrastructure layer
) können mithilfe desFacade
Entwurfsmusters implementiert werden . Andere Domain-Dienste sind nicht.Es gibt keine feste Regel etwa , wie sie zu implementieren, ohne die wichtige Regel , dass der
Domain layer
Most hängt nicht von anderen Schichten (und SOLID ).quelle
Ich sehe Dienste in DDD als Ergebnis der Abhängigkeitsinversion .
Wenn Sie "einfache" Abhängigkeiten verwenden würden, würde Ihr Domänencode die Datenbank aufrufen, um eine Entität oder Factory zu speichern oder abzufragen, die eine Entität erstellt, die an eine Datenbank oder einen externen Dienst oder einen anderen Infrastrukturcode gebunden ist.
Aber so sollte Domain-Code nicht sein. Der Domänencode sollte nicht vom Infrastrukturcode abhängen. Da diese Abhängigkeit das Testen und möglicherweise die Wiederverwendung erschwert. Deshalb kehren Sie diese Abhängigkeit um. Sie machen den Infrastrukturcode vom Domänencode abhängig. Und dazu müssen Sie eine Abstraktion einführen. Eine Abstraktion, die definiert, welches Verhalten der Domänencode voraussichtlich von der Infrastruktur implementiert wird.
Und Dienste in DDD sind diese Abstraktion. In den meisten Fällen sollten diese Dienste für Domänencode einfache Schnittstellen sein. Die Implementierung sollte im Infrastrukturcode erfolgen, der von diesen Schnittstellen abhängig ist.
quelle