2010-10-14 3 views
34

Comment modélisons-nous les relations classiques plusieurs-à-plusieurs avec CQRS/DDD?Alternatives aux relations plusieurs-à-plusieurs avec CQRS

Je sais que les implémentations DDD et CQRS et les solutions ont tendance à être spécifiques à un domaine, il peut donc être difficile de trouver une réponse générale à cette question.

Cependant, supposons que nous ayons la relation familière entre Book et Auteur. C'est une relation plusieurs-à-plusieurs classique.

Pour moi, il semble plus naturel que Livre et Auteur sont deux entités différentes que chacun appartiennent à leur agrégat racine. Ainsi, la modélisation explicite de la relation plusieurs-à-plusieurs n'est pas la solution.

Comment modélisons-nous un AddBookCommand? Nous voulons être en mesure d'ajouter un livre à notre bibliothèque, et aussi en quelque sorte indiquer qu'un Auteur a écrit ce livre. Comment modélisons-nous (et persistons-nous) une telle relation?

Ni Livre ni Auteur semblent comme de bons candidats pour Value Objets ...

Répondre

35

En supposant que les deux sont des agrégats, copier toutes les données auteur dont vous avez besoin dans l'ensemble du livre sur l'ajout du nouveau livre si que toutes les commandes suivantes ont suffisamment de données d'auteur pour travailler avec. Maintenant, si l'agrégat Auteur a besoin d'informations sur les livres écrits par l'auteur, il peut "s'abonner" à l'événement NewBookAdded (techniquement, vous pouvez envoyer une commande RegisterAsAuthorOfBook à l'agrégat auteur suite à l'événement NewBookAdded). Je présume que l'on pourrait modéliser cela dans l'autre sens, mais je ne suis pas si intime avec le domaine du livre auteur.

La ligne de fond est que vous ne stockez pas vraiment plusieurs-à-plusieurs parce qu'ils ne sont pas à l'échelle. Vous devez commencer à penser à eux (agrégats) comme l'envoi de messages les uns aux autres. La plus grande question est de savoir ce qui doit être cohérent et à quel moment doit-il être cohérent. Est-ce que nous nous soucions que l'auteur ne reflète pas instantanément le fait qu'un nouveau livre a été ajouté, dont il est l'auteur? Y a-t-il des invariants que l'auteur veut appliquer en ce qui concerne les livres qu'il a écrits (et vice versa)?

Une autre chose est d'arrêter d'être orienté sur les données et plus orienté sur le comportement. Quel est le comportement de l'agrégat Livre et Auteur? Cela indiquera quelles données sont nécessaires et à quel point elles doivent être modélisées.

http://pastie.org/1220582 pour un premier coup à l'agrégat du livre.

+2

Merci, c'est vraiment une excellente réponse! J'ai lu une grande partie de la littérature d'introduction CQRS, mais j'ai seulement commencé récemment et encore besoin d'entrer dans l'état d'esprit :) –

+7

Juste pour ajouter à l'excellente réponse de Yves, si vous regardez plus le comportement alors vous pouvez trouver un ou les deux (ou aucun) des agrégats de livres et d'auteurs sont en réalité des objets de valeur. Une fois que j'ai commencé à penser comme ça, j'ai découvert que beaucoup d'objets que j'avais auparavant considérés comme des entités étaient mieux modélisés comme des objets de valeur et donc beaucoup plus simples. Tout dépend du contexte bien sûr ... – FinnNk

+0

Pourriez-vous s'il vous plaît renouveler le lien si disponible? Je suppose que c'est un exemple de code de votre description. – ibubi