2017-10-16 4 views
1

Je suis sûr que j'ai une bonne compréhension de la façon d'implémenter Repository Pattern, mais je suis coincé dans une boucle de décision concernant les requêtes/méthodes complexes.Modèle de référentiel: Où vont les méthodes complexes?

Si je veux obtenir tous les utilisateurs ou utilisateurs qui ont une certaine valeur de champ sur la table des utilisateurs, il est clair que cela irait dans le référentiel de l'utilisateur. Cependant, que se passe-t-il si j'ai une requête beaucoup plus compliquée, par exemple Tous les utilisateurs qui ont suivi un cours vidéo où le cours vidéo est de ce type? Dans mon modèle, cette requête traverse environ 6 tables.

Je veux être en mesure de nous faire un dépôt pour faire quelque chose comme si (user.completedVideoRequirement), mais j'ai du mal à me convaincre que le référentiel d'utilisateurs est l'endroit pour cela. Cela me semble juste, mais je pourrais en parler assez facilement.

Quelle est la bonne façon?

EDIT: que se passe-t-il si je renvoie des informations autres que des entités de base de données (par exemple, renvoyer true/false ou un autre int). Cela devrait-il arriver au niveau du dépôt, ou devrais-je faire quelque chose comme if (users.CompletedVideoRequirement.Any()) à la place? Je suppose que cela a du sens pour moi d'être toujours sur le référentiel de l'utilisateur, parce que c'est une information sur un utilisateur, mais techniquement, c'est aussi une information sur une vidéo.

+0

Utilisez-vous ef? Si oui, vous devriez avoir un contexte avec toutes les tables du système. Si oui, alors vous pouvez accéder à n'importe quelle table d'un référentiel qui a ce contexte. Quel est le problème avec ça? – cassandrad

Répondre

1

Mon processus de pensée est "qu'est-ce que je retourne"? Puisque la réponse ici est "Utilisateurs", alors UserRepository est en effet le bon repo. Afin de tirer parti de l'optimisation des requêtes de votre base de données, vous avez peut-être une centaine de façons différentes de filtrer les utilisateurs, ceux-ci iront tous dans UserRepo. (ok une centaine peut être exagérée)

Chaque fois que vous avez besoin d'un utilisateur ou d'une collection d'utilisateurs, vous devriez pouvoir aller à UserRepository pour l'obtenir. C'est son but dans la vie, pour vous donner des utilisateurs, mais vous avez besoin d'eux filtrés.

+0

J'ai accepté votre réponse, car elle répond parfaitement à la formulation originale de la question. En outre, j'imagine que cela fonctionnera pour la version éditée. J'ai modifié la question pour inclure des méthodes qui ne renvoient pas les objets de base de données en tant que résultats (par exemple, t/f, int) – DiscipleMichael