Dans Domain Driven Design, la couche de domaine peut avoir plusieurs services (traditionnels). Par exemple, pour le domaine Utilisateur, nous pouvons avoir:
- Un UserFactory, qui construit des objets utilisateur de différentes manières
- Un UserRepository, qui est responsable de l'interaction avec les services de persistance dans la couche infrastructure
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?
Réponses:
Domain services
sont mieux décrits par ce qu'ils ne sont pas:Entities
niAggregate roots
Value objects
Entity
ou à unValue object
Un exemple de a
Domain service
est unSaga/Process manager
: il coordonne un long processus impliquant plusieursAggregate roots
, possibles de différentsBounded contexts
.Cela étant dit, ce qui est un
Domain service
et comment il est mis en œuvre sont deux choses orthogonales.Certains services de domaine comme un
UserRepository
(composé d'une interface définie dans leDomain layer
et d'une implémentation concrète dans leInfrastructure layer
) peuvent être implémentés à l'aide duFacade
modèle de conception. Les autres services de domaine ne le sont pas.Il n'y a pas de règle stricte sur la façon de les implémenter, à part la règle importante qui
Domain layer
ne doit pas dépendre d'autres couches (et SOLID ).la source
Je vois des services dans DDD suite à l' 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.
la source