Dans la conception pilotée par domaine, la couche de domaine peut avoir plusieurs services (traditionnels). Par exemple, pour le domaine Utilisateur, nous pouvons avoir:
Un UserService dans la couche domaine est-il simplement un médiateur et/ou une façade pour ces deux services et la couche infrastructure, ou y a-t-il plus?
Domain services
sont mieux décrits par ce qu'ils ne sont pas:
Entities
ni Aggregate roots
Value objects
Entity
ou une Value object
Un exemple de Domain service
est un Saga/Process manager
: il coordonne un long processus impliquant plusieurs Aggregate roots
, possible à partir de différents Bounded contexts
.
Cela étant dit, ce qui est un Domain service
et comment il est implémenté sont deux choses orthogonales.
Un service utilisateur dans la couche domaine est-il simplement un médiateur et/ou une façade pour ces deux services et la couche infrastructure, ou y a-t-il plus?
Certains services de domaine comme un UserRepository
(composé d'une interface définie dans le Domain layer
et une implémentation concrète dans le Infrastructure layer
) peut être implémenté en utilisant le modèle de conception Facade
. Les autres services de domaine ne le sont pas.
Il n'y a pas de règle stricte sur comment les implémenter, autre que la règle importante que le Domain layer
ne doit pas dépendre d'autres couches (et S.O.L.I.D. ).
Je vois des services dans DDD à la suite de Inversion de dépendance .
Si vous deviez utiliser des dépendances "simples", votre code de domaine appellerait la base de données pour enregistrer ou interroger une entité, ou une fabrique, qui crée une entité, qui est liée à la base de données ou à un service externe ou à une sorte d'autre code d'infrastructure.
Mais ce n'est pas ainsi que le code de domaine devrait être. Le code de domaine ne doit pas dépendre du code d'infrastructure. Comme cette dépendance rend plus difficile à tester et, éventuellement, à réutiliser. C'est pourquoi vous inversez cette dépendance. Vous faites dépendre le code d'infrastructure du code de domaine. Et pour ce faire, vous devez introduire une abstraction. Une abstraction qui définit le comportement que le code de domaine attend d'être mis en œuvre par l'infrastructure.
Et les services en DDD sont cette abstraction. Dans la majorité des cas, pour le code de domaine, ces services doivent être des interfaces simples. Et l'implémentation devrait être dans le code d'infrastructure, qui dépend de ces interfaces.