2015-08-05 1 views
3

Je travaille sur une application web de facturation qui utilise le sourcing d'événements et CQRS.dénormaliseurs CQRS/ES

J'ai 2 dénormaliseurs pour différentes requêtes (un pour une liste de résumés de factures, et un pour une facture unique avec tous les détails). Je trouve étrange que j'ai besoin de copier beaucoup de la logique pour ces 2 dénormaliseurs - par exemple, écouter les événements qui changent le total, le sous-total, les taxes, etc

J'ai fini par passer l'agrégat lui-même, qui contient le réel données calculées, sur le bus de messagerie au lieu de seulement les événements et les dénormaliseurs l'écoutaient au lieu des événements.

Cela m'a simplifié la tâche, mais semble différent du modèle. Cette approche n'a été mentionnée dans aucun des articles que j'ai lus. J'ai aimé l'idée de ne transmettre que les événements sur le bus et de faire en sorte que chaque dénormaliseur réagisse à ce dont il a besoin, mais en pratique, il se sentait plus encombrant.

J'aimerais entendre ce que vous pensez.

Merci pour votre aide!

+0

"copier une grande partie de la logique": quelle logique exactement? Pouvez-vous donner un exemple ? – guillaume31

+0

@ guillaume31 Bien sûr, par exemple - l'utilisateur ajoute une taxe à la facture. J'ai un événement TaxAdded (taux: Double), qui modifie le total de la facture. Je souhaite mettre à jour le résumé et les vues détaillées en ajoutant le montant de la taxe au total de la facture. En passant l'agrégat lui-même je peux simplement faire le calcul une fois (dans l'ensemble), et mettre à jour les deux vues en fonction de ce calcul – amitayh

+3

Vous pouvez aussi simplement faire le calcul une fois dans l'agrégat et inclure uniquement les données changées avec l'événement par exemple le nouveau total au lieu du taux d'imposition). Pas besoin de passer l'agrégat entier. – guillaume31

Répondre

2

Comme suggéré par guillaume31 dans le commentaire ci-dessus, vous pouvez simplement enrichir votre modèle de domaine avec des événements spéciaux tels que NewTotalComputed. En fonction du nombre d'événements, cela pourrait rapidement encombrer votre modèle de domaine.

Vous pouvez également refactoriser la logique de calcul dans une classe de stratégie spéciale utilisée à la fois par le modèle de domaine (agrégat racine) et le modèle lu.

+1

True. Mais je n'impliquais pas nécessairement un nouvel événement. Vous pouvez garder 'TaxAdded' qui est plus révélateur d'intention, et envoyer NewTotal au lieu de/en plus de TaxRate. – guillaume31