J'essaie d'apprendre des façons de DDD et des sujets connexes. Je suis venu avec une idée de contexte borné simple pour mettre en œuvre la «banque»: il y a des comptes, l'argent peut être déposé, retiré et transféré entre eux. Il est également important de conserver l'historique des modifications.
J'ai identifié une entité de compte et cette source d'événements serait utile pour garder une trace de ses modifications. D'autres entités ou objets de valeur ne sont pas pertinents pour le problème, donc je ne les mentionnerai pas.
Lorsque l'on considère les dépôts et les retraits - c'est relativement simple, car il n'y a qu'un seul agrégat modifié.
Lors du transfert, c'est différent - deux agrégats doivent être modifiés par un événement MoneyTransferred . DDD déconseille de modifier plusieurs agrégats en une seule transaction. D'autre part, la règle du sourcing d'événements consiste à appliquer des événements aux entités et à modifier l'état en fonction de celles-ci. Si l'événement pouvait être stocké simplement dans la base de données, il n'y aurait aucun problème. Mais pour empêcher la modification simultanée des entités issues d'événements, nous devons implémenter quelque chose de versionner le flux d'événements de chaque agrégat (pour conserver leurs limites de transaction). Avec le versionnage vient un autre problème - je ne peux pas utiliser de structures simples pour stocker des événements et les relire pour les appliquer à l'agrégation.
Ma question est la suivante: comment puis-je réunir ces trois principes: "un agrégat une transaction", "événement-> changement d'agrégat" et "prévention des modifications simultanées"?