Nous utilisons un tas de classes distinctes suffixées avec -repository
pour récupérer les données de la base de données; pour chaque table son propre référentiel.
Nous avons par exemple une customerrepository
classe qui a toutes sortes de méthodes pour récupérer les clients, et une vacancyrepository
qui a toutes sortes de méthodes pour récupérer les postes vacants.
J'ai deux questions sur cette façon de faire:
Que diriez-vous d'obtenir des données qui s'étendent sur plusieurs tables? Par exemple, j'ai un écran qui montre tous les clients qui n'ont pas encore créé de poste vacant. Une
customerrepository
méthode peut-elle utiliser lesvacancyrespository
, ou les deux référentiels renvoient-ils des résultats et existe-t-il une classe plus élevée dans la hiérarchie (appelons-la adataservice
) qui obtient les résultats des deux référentiels et les combine en un seul résultat?quelle logique un tel référentiel peut-il gérer?
Je pense qu'il est OK d'implémenter le 'where active == true' dans un référentiel pour récupérer uniquement les enregistrements actifs, ou même cette logique simple devrait-elle être gérée par une classe plus élevée dans la hiérarchie (appelons-la adataservice
)?
L'exemple que je rencontrais maintenant est celui-ci:
Nous avons une liste de questions, qui contient une ou plusieurs questions.
La question peut avoir un résultat, qui est conservé dans un tableau séparé.
Ainsi, lorsque vous souhaitez récupérer le résultat total de la liste de questions, vous devez combiner les données du questionlist
tableau, du tableau des questions et du questionstatus
tableau.
À l'heure actuelle, nous avons 3 référentiels différents pour ces tables.
Si je demandais questionlistrepository
quel est le résultat total pour la liste numéro 12, il faudrait obtenir des données de deux autres référentiels et donc avoir une certaine logique, est-ce autorisé?
Ou existe-t-il un questionlistdataservice
qui sait quels référentiels utiliser?
Une dernière chose: nos référentiels peuvent entraîner un IQueryable
afin qu'un service appelant puisse facilement combiner les résultats, mais qu'en est-il lorsque ce n'est pas le cas, je ne pense pas que ce soit une bonne idée de récupérer tout le contenu des trois tables à partir du base de données.
la source
Réponses:
Le référentiel renvoie des objets de domaine et est construit au-dessus des couches de mappage. Pour un domaine de domaine très simple, les objets et les tables de base de données peuvent être très similaires.
Si votre référentiel retourne toujours une représentation exacte de votre structure de données, il peut s'agir en fait de Table Data Gateway aka Data Access Object (DAO).
Exemple: votre base de données contient des tables pour la personne et l'adresse. Dans votre application, l'adresse de domaine n'est pas une entité en soi, c'est juste une propriété de Person. Dans ce cas, vous n'auriez pas PersonRepository et AddressRepository. Vous avez juste PersonRepository. Le domaine ne doit pas se soucier de la persistance des données du domaine. Ces responsabilités sont dans une couche derrière le référentiel.
D'après votre exemple, il semblerait que vous ayez réellement des DAO et que vous venez de les nommer Référentiels.
la source