Quelqu'un peut-il m'expliquer le modèle de référentiel dans .NET, étape par étape, en donnant un exemple ou une démonstration très simple.
Je sais que c'est une question très courante, mais jusqu'à présent, je n'ai pas trouvé de réponse satisfaisante.
c#
asp.net
design-patterns
repository
Sa Patil
la source
la source
Réponses:
En résumé, je décrirais l'impact plus large du modèle de référentiel. Il permet à tout votre code d'utiliser des objets sans avoir à savoir comment les objets sont persistants. Toute la connaissance de la persistance, y compris le mappage des tables aux objets, est contenue en toute sécurité dans le référentiel.
Très souvent, vous trouverez des requêtes SQL dispersées dans la base de code et lorsque vous venez d'ajouter une colonne à une table, vous devez rechercher des fichiers de code pour essayer de trouver les utilisations d'une table. L'impact du changement est considérable.
Avec le modèle de référentiel, vous n'auriez besoin de modifier qu'un seul objet et un seul référentiel. L'impact est très faible.
Il serait peut-être utile de réfléchir à la raison pour laquelle vous utiliseriez le modèle de référentiel. Voici quelques raisons:
Vous avez un seul endroit pour apporter des modifications à votre accès aux données
Vous avez un seul endroit responsable d'un ensemble de tables (généralement)
Il est facile de remplacer un référentiel par une fausse implémentation pour les tests - vous n'avez donc pas besoin d'avoir une base de données disponible pour vos tests unitaires
Il y a aussi d'autres avantages, par exemple, si vous utilisiez MySQL et que vous vouliez passer à SQL Server - mais je n'ai jamais vraiment vu cela en pratique!
la source
IConnection
,ICommand
etc partie qui cache le type de base. Le référentiel est généralement plus centré sur le domaine.Voici un bel exemple: l'exemple de modèle de référentiel en C #
Fondamentalement, le référentiel masque les détails de la façon dont les données sont récupérées / conservées de / vers la base de données. Sous les couvertures:
la source
IDbContext
) ou dans nhibernate (ISession
). Un référentiel correctement implémenté résume TOUTES les informations spécifiques à la persistance (comme le fonctionnement du fournisseur Linq To Sql actuel). c'est-à-dire ne jamais exposerIQueryable
.IQueryable
n'est pas une information spécifique à la persistance. Le support de IQueryable peut être aussi simple qu'un tableau codé en dur, ou il peut provenir d'un fichier XML, d'un service Web, d'une base de données, d'un fichier plat, etc. Je ne recommanderais pas un référentiel qui n'exposerait pas IQueryable comme toujours conduit à un accès aux données lent dans tous les cas, où l'exposition à IQueryable permettra à certaines instances d'améliorer les performances, le cas échéant, si le magasin de persistance a cette capacité. De plus, masquer DbContext vous permet de passer à un autre ORM si besoin est (ou pas d'ORM!)IN
clause sql sans savoir comment le fournisseur LinqToSql spécifique le fait.