Je cherche depuis un certain temps une bonne solution aux problèmes présentés par le modèle typique de référentiel (liste croissante de méthodes pour les requêtes spécialisées, etc. voir: http://ayende.com/blog/3955/repository- est-le-nouveau-singleton ).
J'aime vraiment l'idée d'utiliser les requêtes de commande, en particulier via l'utilisation du modèle de spécification. Cependant, mon problème avec la spécification est qu'elle ne concerne que les critères de sélections simples (essentiellement, la clause where), et ne traite pas des autres problèmes de requêtes, tels que la jonction, le regroupement, la sélection de sous-ensembles ou la projection, etc. fondamentalement, tous les obstacles supplémentaires que de nombreuses requêtes doivent parcourir pour obtenir le bon ensemble de données.
(note: j'utilise le terme «commande» comme dans le modèle de commande, également connu sous le nom d'objets de requête. Je ne parle pas de commande comme dans la séparation commande / requête où il y a une distinction entre les requêtes et les commandes (mise à jour, suppression, insérer))
Je recherche donc des alternatives qui encapsulent toute la requête, mais toujours suffisamment flexibles pour ne pas simplement échanger des référentiels spaghetti pour une explosion de classes de commande.
J'ai utilisé, par exemple, Linqspecs, et bien que je trouve une certaine valeur à pouvoir attribuer des noms significatifs aux critères de sélection, ce n'est tout simplement pas suffisant. Peut-être suis-je à la recherche d'une solution mixte qui combine plusieurs approches.
Je suis à la recherche de solutions que d'autres pourraient avoir développées pour résoudre ce problème ou pour résoudre un problème différent, tout en satisfaisant à ces exigences. Dans l'article lié, Ayende suggère d'utiliser directement le contexte nHibernate, mais je pense que cela complique grandement votre couche métier car elle doit désormais contenir des informations de requête.
J'offrirai une prime à ce sujet, dès que la période d'attente sera écoulée. Alors, s'il vous plaît, rendez vos solutions dignes de récompense, avec de bonnes explications et je sélectionnerai la meilleure solution et je voterai pour les finalistes.
REMARQUE: je recherche quelque chose qui est basé sur ORM. Il n'est pas nécessaire que ce soit EF ou nHibernate explicitement, mais ce sont les plus courants et conviendraient le mieux. S'il peut être facilement adapté à d'autres ORM, ce serait un bonus. La compatibilité Linq serait également bien.
MISE À JOUR: Je suis vraiment surpris qu'il n'y ait pas beaucoup de bonnes suggestions ici. Il semble que les gens sont soit totalement CQRS, soit complètement dans le camp du référentiel. La plupart de mes applications ne sont pas assez complexes pour justifier le CQRS (quelque chose avec la plupart des défenseurs du CQRS disent volontiers que vous ne devriez pas l'utiliser pour).
MISE À JOUR: Il semble y avoir un peu de confusion ici. Je ne recherche pas une nouvelle technologie d'accès aux données, mais plutôt une interface raisonnablement bien conçue entre l'entreprise et les données.
Idéalement, ce que je recherche, c'est une sorte de croisement entre les objets de requête, le modèle de spécification et le référentiel. Comme je l'ai dit ci-dessus, le modèle de spécification ne traite que de l'aspect de la clause where, et non des autres aspects de la requête, tels que les jointures, les sous-sélections, etc. Les référentiels traitent l'ensemble de la requête, mais deviennent incontrôlables après un certain temps . Les objets de requête traitent également l'ensemble de la requête, mais je ne veux pas simplement remplacer les référentiels par des explosions d'objets de requête.