1) Que faites-vous si vous souhaitez désactiver les ORM, vous auriez un code ORM spécifique dans votre application si vous ne le contenez pas dans un référentiel.
Je n'ai pas encore été dans une position où l'entreprise a soudainement décidé de changer de technologie d'accès aux données. Si cela se produit, des travaux seront nécessaires. J'ai tendance à abstraire les opérations d'accès aux données via des interfaces. Le référentiel est un moyen de résoudre ce problème.
J'aurais alors un assemblage différent pour la mise en œuvre concrète de ma couche d'accès aux données. Par exemple, je pourrais avoir:
Company.Product.Data
et Company.Product.Data.EntityFramework
assemblages. Le premier assemblage serait utilisé uniquement pour les interfaces, alors qu'un autre serait une implémentation concrète de la logique d'accès aux données d'Entity Framework.
2) Le modèle de référentiel est-il toujours valide lorsque vous n'utilisez pas d'ORM et vous utilisez ADO.net pour l'accès aux données et le remplissage des données d'objet vous-même?
Je pense que c'est à vous de décider quel modèle est valide ou non. J'ai utilisé un modèle de référentiel dans la couche de présentation. Une chose à garder à l'esprit est que les gens aiment jeter des responsabilités dans des référentiels. Avant de vous en rendre compte, votre classe de référentiel dansera, chantera et fera toutes sortes de choses. Vous voulez éviter cela.
J'ai vu une classe de référentiel qui a commencé par avoir des responsabilités GetAll, GetById, Update et Delete, ce qui est bien. Au moment où le projet était terminé, cette même classe avait des dizaines de méthodes (responsabilités) qui n'auraient jamais dû être là. Par exemple GetByForename, GetBySurname, UpdateWithExclusions et toutes sortes de trucs fous.
C'est là que les requêtes et les commandes entrent en jeu.
3) Si vous utilisez un ORM mais pas le modèle de référentiel où conservez-vous les requêtes couramment utilisées. Serait-il sage de représenter chaque requête en tant que classe et d'avoir une sorte de fabrique de requêtes pour créer des instances?
Je pense que c'est une très bonne idée d'utiliser des requêtes et des commandes au lieu de référentiels. Je fais ce qui suit:
Définissez l'interface pour une requête. Cela vous aidera à effectuer des tests unitaires. Par exemplepublic interface IGetProductsByCategoryQuery { ... }
Définissez une implémentation concrète pour une requête. Vous pourrez les injecter via le cadre IoC de votre choix. Par exemplepublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Maintenant, au lieu de polluer le référentiel avec des dizaines de responsabilités, je regroupe simplement mes requêtes dans des espaces de noms. Par exemple, une interface pour la requête ci-dessus peut vivre: Company.SolutionName.Products.Queries
et l'implémentation peut vivre dansCompany.SolutionName.Products.Queries.Implementation
Lorsqu'il s'agit de mettre à jour ou de supprimer des données, j'utilise le modèle de commande de la même manière.
Certains pourraient être en désaccord et dire qu'avant la fin du projet, vous aurez des dizaines de classes et d'espaces de noms. Oui. Dans mon esprit, c'est une bonne chose car vous pouvez parcourir la solution dans l'IDE de votre choix et voir instantanément le type de responsabilités de certains composants. Si vous avez décidé d'utiliser un modèle de référentiel à la place, vous devrez regarder à l'intérieur de chaque classe de référentiel en essayant de déterminer ses responsabilités.