web-dev-qa-db-fra.com

DDD: où placer les gestionnaires d'événements de domaine?

Pourriez-vous me dire votre opinion sur la couche qui est la bonne pour placer les gestionnaires d'événements de domaine dans DDD? Par exemple, j'ai un service d'application pour ajouter un nouveau contrat et j'aimerais envoyer une notification par e-mail à la personne de contact, une fois le contrat ajouté, tout comme le service d'application ou le service de domaine de l'expéditeur de l'e-mail (qui gère l'événement ContractAdded) ou autre chose?

13
Toni

Je place les gestionnaires d'événements de domaine dans la couche application.

L'événement de domaine est un moyen de dire aux couches extérieures (ou au monde extérieur) que quelque chose s'est produit dans la couche de domaine. Que faire de l'événement dépend de l'application. L'application peut informer l'utilisateur des modifications ou appeler un autre domaine pour faire quelque chose. L'application est responsable de l'orchestration des opérations de domaine en réaction aux actions des utilisateurs, aux demandes Web ou aux événements de domaine.

12
Eugene Khudoy

Je place les gestionnaires d'événements de domaine dans la couche Domaine en tant qu'interface de domaine IDomainEventHandler.

Un exemple de gestionnaire d'événements de domaine est une stratégie qui s'abonne à certains événements de domaine afin d'initialiser une nouvelle transaction (par exemple: afin de déclencher une nouvelle commande de domaine), il est donc logique de l'avoir dans la couche Domaine car elle est liée à logique métier.

Nous pourrions penser à un exemple où une commande est confirmée et donc une demande de facture devrait être créée. Nous avons un événement OrderConfirmedEvent qui s'est produit. Une politique dans notre domaine serait chargée de s'abonner à cet événement et de créer une commande de domaine RequestInvoice qui sera gérée par le gestionnaire de commandes et traitée par lui en conséquence.

Si nous avions ce gestionnaire d'événements dans la couche application, cela signifierait que la couche application, en plus d'orchestrer les actions de l'utilisateur, exécuterait une logique métier, ce qui semble incorrect.

Mais nous avons

2
diegosasw

Le livre DDD original (Evans 2004) explique la couche application comme une couche mince qui exerce des objets de domaine en réponse à l'action de l'utilisateur. Les gestionnaires d'événements typiques pour les événements de domaine n'appartiennent donc pas à la couche application.

Il peut être judicieux de placer certains d'entre eux dans la couche domaine, tant que vous ne cassez pas la superposition en créant une dépendance vers le haut.

Si vous avez une couche d'infrastructure qui est en dessous de la couche de domaine, le gestionnaire d'événements ne peut pas être là car il casserait la superposition.

Si vous avez une couche d'adaptateurs au-dessus de la couche de domaine, vous pouvez y créer un gestionnaire d'événements. Découvrez architecture hexagonale .

2
Gudmundur Orn