Référentiel et les objets de requête de répétition. Comment mettre en œuvre des requêtes complexes
J'ai lu beaucoup de posts du modèle de référentiel, mais il ya quelques problèmes pratiques qu'ils ne semblent pas résoudre ou de les expliquer. C'est ce que je comprends sur ce deux modèles:
Le référentiel et le modèle de requête sont complémentaires: objets de Requête représente la logique métier (OÙ clausules) et le modèle de référentiel a un Get(IPredicate) méthode qui prend un objet de requête et retourne un SELECT OÙ le résultat
Le référentiel ne doivent pas avoir une logique d'entreprise: Toute la logique métier doit aller sur les objets de la requête
Actuellement, j'ai une classe qui encapsule chaque objet logique (qui est presque toujours une seule entité de l'objet) qui implémente plusieurs "Obtenir" des méthodes qui mettent en œuvre des requêtes plus complexes (jointures, groupBy, etc...), ce n'est pas un bon modèle, car les classes ont tendance à croître beaucoup à cause de code réutilisable pour les requêtes semblables et de ses méthodes publiques sont dépend du contexte que cette classe sera utilisée, donc, ce qui rend cette classes inutilisable pour de multiples projets qui repose sur la même base de données, ce qui est mon objectif principal de ce projet de refactoring.
Comment les requêtes qui sont plus complexes que d'une sélection unique OÙ sont mis en œuvre avec ces deux modèles, sans fuite de la logique métier dans le référentiel?
Ou si cette logique d'entreprise ne rentre pas dans le référentiel, ni les objets de la requête
d'où vient cette logique d'ajustement?
Grâce
OriginalL'auteur rafael | 2015-03-17
Vous devez vous connecter pour publier un commentaire.
Il y a quelques implémentations de référentiel de modèles et de l'unité de travail qui volent autour sur l'internet. Certains d'entre eux sont assez simples où les développeurs de fondamentalement met en œuvre sa propre pour chaque tableau lui-même manuellement, certains sont génériques, mais pas avancé, et certains sont vraiment cool, générique et vous offrent toujours la possibilité de faire une décente où, la projection et la comme.
Un exemple d'un à mon avis la bonne mise en œuvre peut être trouvé ici :
https://genericunitofworkandrepositories.codeplex.com/
Il est de cibler MVC, ce qui est indiqué par l'interface. Je suis en mettant l'accent sur des applications WPF j'ai donc nécessaire d'ajuster un peu. Mais les idées de cette unité de travail mise en œuvre sont très bonnes.
Il y a un revers à cette mise en œuvre. Parce que c'est en s'appuyant sur les avancées de LINQ et EF fonctionnalités on pourrait arguer que votre sous-jacente de la couche d'accès est d'infecter le dépôt de la couche et les couches en utilisant les référentiels.
Le point de l'être que lorsque, par exemple, que vous souhaitez déplacer loin de EF, les chances sont que vous aurez à changer l'interface de vos dépôts.
Pour montrer la puissance de cette bibliothèque quelques extraits de code pour le prouver :
ou à l'aide de projection:
oui, c'est un bon résumé.
OriginalL'auteur Philip Stuyck
La Référentiel modèle fonctionne bien pour la norme CRUD applications. Où vous en avez besoin pour mettre en œuvre l'ensemble classique de créer, lire, mettre à jour et supprimer des opérations à l'encontre d'une seule table dans une base de données. Dans ce cas, vous créez un référentiel pour chaque table et de permettre l'opération de lecture supplémentaire, de sorte que le filtrage peut être appliquée.
Au niveau suivant, vous avez la Unité de Travail modèle. Ceux-ci sont utilisés pour s'étendre sur plusieurs dépôts et effectuer des opérations de l'entreprise. Si par exemple, vous pouvez lire les valeurs de plusieurs référentiels, effectuer des calculs, puis d'écrire les modifications à plusieurs référentiels. Tout cela allait se produire à l'intérieur d'une transaction de sorte que vous avez toujours un état cohérent de la base de données.
Le problème, c'est quand vous avez des requêtes complexes qui s'étendent sur plusieurs tables. Dans ce cas, vous devrez placer la requête dans le référentiel de la première table dans la requête de clause. Ensuite, vous devrez fournir les paramètres de ce référentiel méthode de sorte qu'il peut être paramétré en tant que de besoin.
Savez-vous ce qui a vraiment bien fonctionné pendant des décennies, à l'interrogation des bases de données? SQL. Appelez-moi blasés, mais ces Référentiel et de l'Unité de modèles de Travail semblent plus architecturées et manque de bénéficier
Le Dépôt contiendra les réels SQL. Unité de Travail contient la transaction logique autour de ce qui sera plusieurs commandes SQL depuis les Dépôts. Je suis d'accord que si vous n'avez jamais à vous soucier de migration vers une autre base de données principale, alors vous ne sont souvent pas besoin de ces modèles.
Vous l'avez droit jusqu'à ce que le dernier paragraphe de votre réponse. Moderne Orm (EF & NHibernate) n'ont pas de problème s'étendant sur plusieurs tables. Le défi de UoW n'est pas d'écrire des entrées multiples dans les différents tableaux, l'ORM déjà fait. L'objectif est de fournir des "automatique" (mis en œuvre par vous), la restauration si l'une des étapes échoue.
OriginalL'auteur Phil Wright