Unterschied zwischen Repository und Service?

105

Was ist der Unterschied zwischen einem Repository und einem Service? Ich scheine es nicht zu begreifen.

Ich spreche über den Datenzugriff über eine Datenzugriffsschicht, normalerweise mit linq to sql.

Sehr oft sehe ich Repositorys mit einfachen CRUD-Methoden und Services mit eher unternehmensspezifischen Methoden.

Wir können diesen Blog-Beitrag als Beispiel nehmen. Wenn Sie sich die Schnittstellen unten ansehen (Bilder), hat er zwei Repositorys und zwei Dienste. Woher weiß man, was man wo hinstellen soll?

Wie gesagt, Repositories scheinen eher für CRUD-ähnliche Operationen und Services geschäftsorientierter zu sein.

Vielen Dank

alexn
quelle
Kannst du kalarisieren? In welchem ​​Kontext? Wie die meisten Wörter hilft der Kontext, in dem diese Wörter verwendet werden, die Bedeutung zu definieren.
David
2
Hinweis: Ich spreche hier nicht über Webdienste oder ähnliches. Ich spreche über den Datenzugriff über eine Datenschicht.
Alexn

Antworten:

78

Ein Repository ist im Wesentlichen eine Fassade für die Persistenz , die die Semantik im Sammlungsstil (Hinzufügen, Aktualisieren, Entfernen) verwendet, um den Zugriff auf Daten / Objekte zu ermöglichen. Auf diese Weise können Sie die Art und Weise, wie Sie Daten / Objekte speichern, vom Rest der Anwendung entkoppeln.

Ein Dienst liefert Koordination oder andere "Dienste", die zum Betreiben Ihrer Anwendung erforderlich sind. Sie unterscheiden sich darin, dass Dienste normalerweise nicht wissen, wie sie aus der Persistenz auf Daten zugreifen können, und Repositorys normalerweise nur auf Daten / Objekte für Dienste zugreifen, über die Sie möglicherweise verfügen.

jlembke
quelle
19
Ich würde sagen, dass ein Repository eine Art Dienst ist, der für den Datenzugriff verwendet wird.
Ian Ringrose
5
Das ist eine feine Definition in dem Sinne, dass fast alles, was wir schreiben, auf einer bestimmten Ebene ein "Service" ist, aber es verliert die grundlegende Absicht, dass ein Repository eine Sammlung von Objekten sein soll.
Jlembke
4
Wenn Sie Unit-Tests durchführen, ist es möglicherweise klarer, sich Repositorys als minimale Abstraktion vorzustellen, um die Verspottung zu minimieren, die zur Vermeidung von Datenbanken erforderlich ist.
Henry Heikkinen
repository= collectionvon backbone.jsoder repository= servicevon angular?
Slideshowp2
159

Im Repository werden die Daten gespeichert. Der Dienst manipuliert die Daten.

Wenn Ihr Geld in einem realen Situationsvergleich in einem Tresor einer Bank gespeichert ist, ist der Tresor das Repository. Der Kassierer, der einzahlt, abhebt usw., ist der Dienst.

David
quelle
7
Danke für diese Antwort! Einfach und prägnant.
Alexn
1
stimmte dem obigen Kommentar zu! Ich liebe auch die Erklärung der realen Welt!
Kleigh
6
mm. Wenn die Bank beschließt, den Tresor loszuwerden und Geld unter Matratzen zu legen, interagiert der Kassierer weiterhin wie zuvor mit Ihnen, ohne dass Sie über die Änderung in der Repository-Schicht Bescheid wissen müssen.
Dennis
1
Ich vermute, der Kunde möchte etwas über diese Implementierung wissen, @Dennis
Chucky
1
@ Tennis Ja. Dies ist tatsächlich einer der Hauptvorteile der Verwendung des Repository-Musters. Sie sollten in der Lage sein, die tatsächliche Implementierung der Repository-Schnittstellen zu ändern, ohne Änderungen am Service vorzunehmen. Dies hat enorme Vorteile für Unit-Tests und die lose Kopplung Ihres Codes.
Warren Parks
12

Ich würde als ersten Versuch im allgemeinen Sinne sagen (bis Sie mehr Kontext angeben, wenn Sie einen haben):

  • In einem Repository platzieren Sie einige globale Objekte, die später verwendet werden sollen.
  • Ein Service ist ein Geschäftslogikcode, der explizit angegeben wird (und idealerweise von der Präsentationsschicht und der Datenbankschicht getrennt ist?).
KLE
quelle
3
Wäre es dann in Ordnung, Folgendes zu tun: Mein Repository hat alle meine komplexen Datenbankaufrufe, dann füge ich in meinem Dienst das Repository als Abhängigkeit ein. Jetzt habe ich leicht testbaren Code und habe meine Bedenken getrennt, da mein Dienst nicht weiß, wie die DB-Aufrufe ausgeführt werden, sondern lediglich die Funktionen des Repositorys aufruft, das dies tut. Daher sind Geschäftslogik und Datenzugriff getrennt. Wäre dies ein praktikabler Ansatz?
Darophi
Wenn die gesamte Logik in Services geschrieben ist, ruft der Controller nur den Service auf.
Islomkhodja Hamidullakhodjaev