J'ai posté une question sur github à l'équipe EF. J'ai reçu une réponse disant qu'il serait préférable de poser cette question ici, donc je vais la copier et la coller ici comme nous en tant que lien afin que d'autres puissent voir les quelques réponses sur GitHub.
Question: Je faisais des recherches et quelqu'un a souligné que la ligne 24 de la classe DBContext indique
DbContext est une combinaison des modèles d'unité de travail et de référentiel.
Cela signifie-t-il que nous n'avons plus besoin d'abstraire EF dans un référentiel, puis d'utiliser et d'interface pour l'injecter dans les contrôleurs?
Message original sur Github: https://github.com/aspnet/EntityFramework/issues/4899
La raison pour laquelle je pose cette question est que je semble entrer dans un endroit où j'ajoute beaucoup de méthodes au référentiel comme GetById, GetByName, GetWithIncludesABC, GetWithIncludes123, etc. et cela semble salir le référentiel dans mon esprit
la source
Réponses:
Si vous ajoutez des méthodes à un référentiel comme
Ensuite, vous feriez mieux de passer à une couche de service et de laisser la couche de service utiliser directement EF. EF a déjà des fonctionnalités similaires aux méthodes ci-dessus que vous ne faites que reproduire à l'infini.
Une couche de service expose les méthodes du domaine d'activité et utilise CRUD pour les implémenter. Par exemple, vous pouvez avoir une méthode appelée
TransferMoney(A, B)
, où A et B vérifient les comptes. Cela vous permet de parler la langue de votre domaine d'activité, tandis que la couche Service gère le CRUD pour vous.La seule raison convaincante pour laquelle je peux penser où vous voudrez peut-être avoir une couche de référentiel distincte est pour que vous puissiez vous moquer de cette couche de référentiel ou remplacer une source de données différente à des fins de test.
la source
Robert Harvey a déclaré dans sa réponse:
C'est précisément pourquoi le modèle de référentiel est toujours pertinent. Je suis également en désaccord avec l'affirmation des équipes d'Entity Framework selon laquelle elles implémentent le modèle de référentiel. Entity Framework est toujours très lié à une base de données. L'objectif du Repository Pattern est de découpler et d'abstraire le mécanisme de persistance exact utilisé dans votre application, de sorte que rien de la mise en œuvre de l'accès aux données ne fuit en dehors de la couche de référentiel.
Si vous utilisez l'API de requête EF en dehors du "référentiel", comme dans un objet de service quelconque, je dirais que vous cassez le modèle.
Maintenant, si ce n'est pas un problème catastrophique pour une base de données comme une fonctionnalité de s'infiltrer dans votre autre code, et vous pouvez garantir que vous n'aurez pas besoin de déplacer certaines de vos opérations CRUD vers un service Web à l'avenir, alors utiliser EF directement serait D'ACCORD.
Fondamentalement, Entity Framework prend la place de l' objet Gateway dans le modèle de référentiel. Je ne le considère pas comme un référentiel lui-même.
la source
TransferFunds()
etBuildWidget()
. Un référentiel ne contient que des méthodes CRUD.Les référentiels ne semblent pas nécessaires - Microsoft dans leurs exemples d'applications de microservices backend ne les utilise pas:
https://github.com/Microsoft/BikeSharing360_BackendServices
L'exemple d'application BikeSharing a été montré sur Connect (); événement (je pense qu'il peut être utilisé comme modèle pour les projets API):
https://blogs.msdn.microsoft.com/visualstudio/2016/12/14/connectdemos-2016-bikesharing360-on-github/
la source