J'installe mes premiers pas dans la conception Domain Driven, acheté le livre bleu et tout, et je me trouve voir trois façons de mettre en œuvre une certaine solution. Pour mémoire: Je ne suis pas en utilisant CQRS ou Sourcing événement.
Disons une demande de l'utilisateur est dans la couche de service d'application. La logique d'affaires pour cette demande est (pour une raison quelconque) séparé en une méthode sur une entité, et une méthode sur un service de domaine. Comment dois-je aller à appeler ces méthodes?
Les options que j'ai recueillies à ce jour sont:
Je pense que ce sont viables, mais je suis incapable de choisir entre les deux. J'ai réfléchi à ce sujet depuis longtemps et je suis venu à un point où je ne vois plus les différences sémantiques entre les trois. Connaissez-vous quelques conseils quand utiliser quoi?
Laissez le service d'application appeler les deux méthodes
Le service d'application est généralement un excellent point de départ pour cela, mais vous devez toujours essayer de changer de comportement aussi proche que possible de l'entité. Le service d'application joue un rôle d'orchestration et établit la phase pour exécuter le comportement du domaine et, en tant que telle, il fournit toutes les dépendances requises. Cependant, lorsque cela est possible, il devrait déléguer le comportement au modèle de domaine.
Utilisez la méthode injection/double envoi pour injecter le service de domaine dans l'entité, laisser l'entité faire sa chose, puis la laisser appeler la méthode du service de domaine (ou l'autre solution, laissant le service de domaine appeler la méthode sur l'entité)
C'est une meilleure approche car davantage le comportement est délégué à l'entité ou au service de domaine. Le moyen le plus découplé de mettre en œuvre ceci est d'avoir une entité exprimer une dépendance à un service est un paramètre de la méthode fournissant le comportement à portée de main.
Soulever un événement de domaine dans la méthode d'entité, dont un gestionnaire qui appelle le service de domaine.
Le modèle d'événement de domaine, comme expliqué par UDI et Evans lui-même, est assez polyvalent et peut être appliqué dans une variété de scénarios. Il y a quelques complications qui l'accompagnent cependant. Premièrement, vous devez vous assurer que vous avez une adaptation appropriée dans l'éditeur de l'événement de domaine. La plupart du temps, vos gestionnaires d'événements de domaine auront des dépendances et si vous utilisez un conteneur de CIO, vous devez vous assurer que des instances appropriées sont injectées. Par exemple, dans une application Web, le [ThreadStatic]
L'attribut est problématique pour la portée. Une autre complexité est celle des frontières transcriptionnelles. Vous devez prendre en compte les transactions, car si une entité augmente un événement de domaine, mais un engagement ultérieur à la base de données échoue, tous les gestionnaires d'événements de domaine auront besoin d'un moyen de renvoyer, sinon vous finirez par soulever un événement invalide. Si toutefois vous avez ces bases couvertes, les événements de domaine sont un excellent modèle pour encapsuler la logique de domaine dans les entités elles-mêmes.
La différence entre l'approche 2 et 3 dépend du cas d'utilisation. Un événement de domaine s'applique lorsque vous souhaitez appeler des comportements supplémentaires en réponse à un événement, qui est au passé. Il s'agit d'une contrainte importante, car le gestionnaire d'événements de domaine ne peut affecter le comportement de l'entité. D'autre part, avec une approche 2, le service injecté risque d'affecter le comportement car il est déclaré une dépendance pour ce comportement particulier.