Comment la conception par Domaine gère-t-elle les rapports?

j'ai trouvé que le DDD est naturel si je travaille sur un type opérationnel/transactionnel d'application. Cependant, je suis toujours rangé dans une façon raisonnable de gérer le type de rapports des fonctions.

le reporting dont je parle n'est pas lié à la génération de rapports, mais aussi à des fonctions qui exécutent des requêtes relativement compliquées. (comme, en donnant le résumé de toutes les commandes qu'un trader a fait, ou afficher le résumé de compte pour les comptes de trading ayant certaines actions, etc). Ils peuvent être simplement une requête ou une fonction de soutien qui est utilisé avec ces fonctions opérationnelles.

pour de telles fonctions, il est tout à fait naturel si nous pouvons effectuer join en SQL (ou n'importe quel langage de requête), obtenir les colonnes que nous sommes intéressés, et retourner le jeu de résultats massaged. Cependant, il semble que cela ne se passe pas aussi bien avec DDD: nous avons besoin d'un dépôt spécial supplémentaire ou d'avoir un dépôt existant le plus lié retournant un "objet entité/valeur" spécial (qui est le resultset). Ce genre d ' "entités" spéciales n'a en fait aucun sens de domaine.

si nous voulons utiliser la couche de domaine significatif, cela peut créer beaucoup de recherches supplémentaires à partir de différents dépôts, plus beaucoup de travail d'agrégation dans la couche de domaine ou de service, ce qui causera facilement des performances horribles dégrader.

j'ai aussi pensé avoir un autre "chemin" pour ce genre de fonction, qui ne passe pas par le "chemin DDD", ayant sa propre façon de obtenez les données du rapport de DB, composez les résultats pour l'affichage. Toutefois, cela va rendre l'application inutilement compliquée, et pire encore, nous avons fourni un chemin supplémentaire de sorte que les développeurs qui est plus habitué au développement traditionnel axé sur la DB peut tendance à utiliser cette voie, même si ce n'est pas approprié.

j'ai pensé qu'une telle situation est assez courante (normalement un grand système ne contiendra pas des fonctions opérationnelles mais aussi des fonctions de rapport et d'enquête), je voudrais savoir comment les gens sont de traiter avec elle?

19
demandé sur Adrian Shum 2012-07-19 09:04:10

4 réponses

nous avons récemment commencé à utiliser DDD pour le développement du système. J'avais les mêmes préoccupations que les vôtres, mais je me suis finalement résigné à la ségrégation de la responsabilité des requêtes de commandement (CQRS) [Fowler, Young, Dahan]. Alors qu'il faut "le chemin de la base de données" pour poser une question, Je ne pense pas du tout qu'il soit tentant de le faire directement à la base de données pour les commandes (celles qui modifient l'état du domaine). La séparation est très claire - les commandes passent par le domaine, les requêtes vont directement à la base de données.

2
répondu jett 2012-07-19 16:27:27

en ce qui concerne la Déclaration des DDD dans la plupart des cas, il s'agit d'un contexte délimité distinct et d'un sous-domaine de soutien où la conception axée sur le domaine serait exagérée. Rappelez-vous le concept le plus important de DDD: concentrez vos efforts de modélisation sur le domaine de base et mettez en œuvre tout le reste en utilisant la solution la plus simple possible.

19
répondu Dennis Traub 2012-07-22 21:57:08

une approche serait d'avoir un système de rapport séparé qui a couru des flux de données de la mémoire de données de votre application pour stocker une autre copie des données dans un format plus relationnel.

un raccourci que j'ai utilisé est de créer une vue ou une procédure stockée pour retourner les données jointes dans un simple objet muet.

1
répondu Mike Cole 2012-07-19 05:08:59

questions relativement compliquées. (comme, en donnant le résumé de toutes les commandes qu'un trader a fait, ou afficher le résumé de compte pour les comptes de trading ayant certaines actions, etc)

il est courant que les dépôts exécutent de telles tâches. Je pense que vous vous inquiétez sur la façon de mettre en œuvre cela efficacement, et la réponse à cela est "chargement paresseux".

par exemple, prenons "résumé de toutes les commandes que le trader a faites". Le "résumé" est une tâche de rapport, donc, il faut mettre cela de côté. La tâche de domaine est "trouver toutes les commandes pour un trader". Vous pouvez avoir une méthode de dépôt comme ceci:

List<Order> findOrdersByTrader(Trader trader);

vous pouvez implémenter ceci en ne chargeant que les informations minimales (sommaires) pour chaque commande. Si vous injectez alors l'interface du dépôt dans le Order entité, l'entité elle-même peut faire appel au dépôt pour charger des sous-entités supplémentaires selon les besoins.


mise à Jour: votre commentaire fait problème plus clair -- j'ai mal compris la partie agrégation plus tôt. Il semble que le "récapitulatif de commande" appartient vraiment dans votre domaine. Parfois, il n'est pas évident qu'un concept fasse partie du domaine, mais si c'est une fonctionnalité dont les utilisateurs parlent ("je veux voir un résumé des commandes passées par ce trader") et qu'il n'y a pas d'objet existant qui puisse faire cela, c'est un signe d'un concept caché dans votre domaine. Après tout, vous avez besoin d' objet de garder trace de combien de commandes pour chaque action" et il n'y a aucune raison que cet objet ne puisse pas faire partie de votre domaine.

0
répondu casablanca 2012-07-19 13:46:22