Différence entre référentiel et service?

106

Quelle est la différence entre un référentiel et un service? Je ne semble pas le comprendre.

Je parle de l'accès aux données via une couche d'accès aux données, généralement avec linq à sql.

Très souvent, je vois des référentiels avec des méthodes CRUD simples et des services avec des méthodes plus spécifiques à l'entreprise.

Nous pouvons prendre cet article de blog comme exemple. Si vous regardez les interfaces en bas (images), il a deux référentiels et deux services. Comment sait-on quoi mettre où?

Comme je l'ai dit, les référentiels semblent être davantage destinés aux opérations de type CRUD et aux services plus orientés métier.

Merci

Alexn
la source
Pouvez-vous calarifier? Dans quel contexte? Comme la plupart des mots, le contexte dans lequel ces mots sont utilisés aide à en définir le sens.
David du
2
Remarque: je ne parle pas de services Web ou de quelque chose ici. Je parle de l'accès aux données via une couche de données.
alexn le

Réponses:

78

Un référentiel est essentiellement une façade pour la persistance qui utilise la sémantique de style Collection (Ajouter, Mettre à jour, Supprimer) pour fournir l'accès aux données / objets. C'est un moyen de découpler la façon dont vous stockez les données / objets du reste de l'application.

Un service fournit la coordination ou d'autres «services» nécessaires au fonctionnement de votre application. Ils sont très différents en ce sens que les services ne savent généralement pas comment accéder aux données à partir de la persistance, et les référentiels n'accèdent généralement qu'aux données / objets pour tous les services que vous pouvez avoir.

jlembke
la source
19
Je dirais qu'un référentiel est un type de service utilisé pour l'accès aux données.
Ian Ringrose le
5
C'est une définition fine dans le sens où presque tout ce que nous écrivons est un «service» à un certain niveau, mais cela perd l'intention de base qu'un référentiel est censé être une collection d'objets.
jlembke
4
Si vous faites des tests unitaires, il peut être plus clair de considérer les référentiels comme l'abstraction minimale pour minimiser les moqueries nécessaires pour éviter la base de données.
Henry Heikkinen
repository= collectionde backbone.jsou repository= servicede angular?
diaporamap2
160

Le référentiel est l'endroit où les données sont stockées. Le service est ce qui manipule les données.

Dans une comparaison de situation réelle, si votre argent est stocké dans un coffre-fort dans une banque, le coffre-fort est le référentiel. Le caissier qui dépose, retire, etc. est le service.

David
la source
7
Merci pour cette réponse! Simple et concis.
alexn le
1
d'accord avec le commentaire ci-dessus! J'adore aussi l'explication du monde réel!
Kleigh
6
mm. Ainsi, si la banque décide de se débarrasser du coffre-fort et de mettre de l'argent sous des matras, le caissier continuera d'interagir avec vous comme auparavant, sans que vous ayez à connaître le changement dans la couche de dépôt.
Dennis
1
Je pense que le client voudrait en savoir plus sur cette implémentation, @Dennis
Chucky
1
@Dennis Oui. C'est en fait l'un des principaux avantages de l'utilisation du modèle de référentiel. Vous devriez pouvoir modifier l'implémentation réelle des interfaces de référentiel sans rien changer sur le service. Cela présente d'énormes avantages pour les tests unitaires et pour que votre code soit faiblement couplé.
Warren Parks
12

Je dirais dans un premier temps, au sens général (jusqu'à ce que vous donniez plus de contexte si vous en avez un):

  • un référentiel est l'endroit où vous placez certains objets globaux, à utiliser plus tard.
  • un service est un code de logique métier, rendu explicite (et idéalement séparé de la couche Présentation et de la couche base de données?)
KLE
la source
3
Serait-il correct de faire ce qui suit alors: Mon référentiel a tous mes appels de base de données complexes, puis dans mon service, j'injecte le référentiel en tant que dépendance. Maintenant, j'ai du code facilement testable et j'ai séparé mes préoccupations, car mon service ne sait pas comment les appels DB sont effectués, mais appelle simplement les fonctions du référentiel qui le font. Par conséquent, la logique métier et l'accès aux données sont séparés. Serait-ce une approche viable?
darophi
1
Si toute la logique est écrite dans les services, alors le contrôleur n'appellera que le service?
Islomkhodja Hamidullakhodjaev