Różnica między repozytorium a usługą?

106

Jaka jest różnica między repozytorium a usługą? Wydaje się, że tego nie rozumiem.

Mówię o dostępie do danych przez warstwę dostępu do danych, zwykle z linq do sql.

Bardzo często widzę repozytoria z prostymi metodami CRUD i usługi z metodami bardziej specyficznymi dla biznesu.

Jako przykład możemy wziąć ten post na blogu. Jeśli spojrzysz na interfejsy na dole (obrazy), ma on dwa repozytoria i dwie usługi. Skąd wiadomo, co gdzie umieścić?

Jak powiedziałem, repozytoria wydają się być bardziej zorientowane na operacje podobne do CRUD, a usługi zorientowane na biznes.

Dzięki

alexn
źródło
Czy możesz kalaryfikować? W jakim kontekście? Jak większość słów, kontekst, w którym te słowa są używane, pomaga zdefiniować znaczenie.
David
2
Uwaga: nie mówię tutaj o usługach internetowych ani o czymś takim. Mówię o dostępie do danych przez warstwę danych.
alexn

Odpowiedzi:

78

Repozytorium jest zasadniczo fasadą trwałości, która wykorzystuje semantykę stylu kolekcji (Dodaj, Aktualizuj, Usuń) w celu zapewnienia dostępu do danych / obiektów. Jest to sposób na oddzielenie sposobu przechowywania danych / obiektów od reszty aplikacji.

Usługa zapewnia koordynację lub inne „usługi” wymagane do obsługi aplikacji. Różnią się one bardzo, ponieważ usługi zazwyczaj nie wiedzą, jak uzyskać dostęp do danych z trwałości, a repozytoria zwykle mają dostęp tylko do danych / obiektów wszelkich usług, które możesz mieć.

jlembke
źródło
19
Powiedziałbym, że repozytorium to rodzaj usługi służącej do dostępu do danych.
Ian Ringrose
5
To dobra definicja w tym sensie, że prawie wszystko, co piszemy, jest na pewnym poziomie „usługą”, ale traci podstawową intencję, że repozytorium ma być zbiorem obiektów.
jlembke
4
Jeśli zastanawiasz się nad testowaniem jednostkowym, jaśniejsze może być myślenie o repozytoriach jako minimalnej abstrakcji, aby zminimalizować mockowanie potrzebne do uniknięcia bazy danych.
Henry Heikkinen
repository= collectionz backbone.jslub repository= servicez angular?
pokaz
160

Repozytorium to miejsce, w którym przechowywane są dane. Usługa manipuluje danymi.

W porównaniu z rzeczywistą sytuacją, jeśli twoje pieniądze są przechowywane w skarbcu w banku, skarbiec jest repozytorium. Usługą jest kasjer, który dokonuje wpłat, wypłat itp.

David
źródło
7
Dzięki za tę odpowiedź! Proste i zwięzłe.
alexn
1
zgodził się z powyższym komentarzem! Uwielbiam też wyjaśnienie prawdziwego świata!
Kleigh
6
mm. więc jeśli bank zdecyduje się pozbyć skarbca i umieścić pieniądze pod matrycami, kasjer będzie nadal z Tobą kontaktował się tak, jak poprzednio, bez konieczności informowania Cię o zmianie w warstwie repozytorium.
Dennis
1
Podejrzewam, że klient chciałby wiedzieć o tej implementacji, @Dennis
Chucky
1
@Dennis Yes. W rzeczywistości jest to jedna z głównych zalet używania wzorca repozytorium. Powinieneś być w stanie zmienić rzeczywistą implementację interfejsów repozytorium bez zmiany czegokolwiek w usłudze. Ma to ogromne zalety w testowaniu jednostkowym i luźnym łączeniu kodu.
Warren Parks,
12

Powiedziałbym jako pierwsza próba, w ogólnym sensie (dopóki nie podasz więcej kontekstu, jeśli go masz):

  • repozytorium jest gdzie umieścić kilka obiektów globalnych, które mają być wykorzystane później.
  • usługa jest kod logiki biznesowej, wyraźnie (i idealnie oddzielony od warstwy prezentacji i warstwy bazy danych?)
KLE
źródło
3
Czy byłoby dobrze wykonać następujące czynności: Moje repozytorium ma wszystkie moje złożone wywołania bazy danych, a następnie w mojej usłudze wstrzykuję repozytorium jako zależność. Teraz mam łatwy do przetestowania kod i oddzieliłem moje obawy, ponieważ moja usługa nie wie, jak wykonywane są wywołania bazy danych, a jedynie wywołuje funkcje repozytorium, które to robi. Dlatego logika biznesowa i dostęp do danych są oddzielone. Czy byłoby to wykonalne podejście?
darophi
1
Jeśli cała logika jest zapisana w usługach, to sterownik wywoła tylko usługę?
Islomkhodja Hamidullakhodjaev