Differenza tra repository e servizio?


106

Qual è la differenza tra un repository e un servizio? Non mi sembra di afferrarlo.

Sto parlando di accesso ai dati tramite un livello di accesso ai dati, in genere con linq a sql.

Molto spesso vedo repository con metodi CRUD semplici e servizi con metodi più specifici per l'azienda.

Possiamo prendere questo post del blog come esempio. Se guardi le interfacce in basso (immagini), ha due repository e due servizi. Come si fa a sapere cosa mettere dove?

Come ho detto, i repository sembrano essere più per operazioni simili a CRUD e servizi più orientati al business.

Grazie


Puoi chiarire? In che contesto? Come la maggior parte delle parole, il contesto in cui vengono utilizzate queste parole aiuta a definire il significato.
David

2
Nota: non sto parlando di servizi web o qualcosa del genere qui. Sto parlando dell'accesso ai dati tramite un livello dati.
alexn

Risposte:


78

Un repository è essenzialmente una facciata per la persistenza che utilizza la semantica dello stile di raccolta (Aggiungi, Aggiorna, Rimuovi) per fornire l'accesso a dati / oggetti. È un modo per separare il modo in cui memorizzi dati / oggetti dal resto dell'applicazione.

Un servizio fornisce il coordinamento o altri "servizi" necessari per il funzionamento dell'applicazione. Sono molto diversi in quanto i servizi in genere non sanno come accedere ai dati dalla persistenza e i repository in genere accedono solo ai dati / oggetti per qualsiasi servizio tu possa avere.


19
Direi che un repository è un tipo di servizio che viene utilizzato per l'accesso ai dati.
Ian Ringrose

5
Questa è una bella definizione nel senso che quasi tutto ciò che scriviamo è un "servizio" a un certo livello, ma perde l'intento di base che un repository dovrebbe essere una raccolta di oggetti.
jlembke

4
Se esegui il test delle unità, potrebbe essere più chiaro pensare ai repository come all'astrazione minima per ridurre al minimo il mocking necessario per evitare il database.
Henry Heikkinen

repository= collectionda backbone.jso repository= serviceda angular?
slideshowp2

160

Il repository è il luogo in cui vengono archiviati i dati. Il servizio è ciò che manipola i dati.

In un confronto della situazione del mondo reale, se i tuoi soldi sono conservati in un caveau in una banca, il caveau è il deposito. Il cassiere che deposita, ritira, ecc. È il servizio.


7
Grazie per questa risposta! Semplice e conciso.
alexn

1
d'accordo con il commento sopra! Adoro anche la spiegazione del mondo reale!
Kleigh

6
mm. quindi, se la banca decide di sbarazzarsi del caveau e di mettere i soldi sotto i materassi, il cassiere continuerà a interagire con te come prima, senza che tu debba sapere del cambiamento nel livello del deposito.
Dennis

1
Sospetto che il cliente vorrebbe sapere di tale implementazione, @Dennis
Chucky

1
@ Dennis Sì. Questo è in realtà uno dei principali vantaggi dell'utilizzo del modello di repository. Dovresti essere in grado di modificare l'effettiva implementazione delle interfacce del repository senza modificare nulla sul servizio. Ciò ha enormi vantaggi per i test di unità e per rendere il codice liberamente accoppiato.
Warren Parks,

12

Direi come primo tentativo, in senso generale (finché non dai più contesto se ne hai uno):

  • un repository è dove si posizionano alcuni oggetti globali, da utilizzare in seguito.
  • un servizio è un codice di logica aziendale, reso esplicito (e idealmente separato dal livello Presentazione e dal livello database?)

3
Allora andrebbe bene fare quanto segue: Il mio repository ha tutte le mie complesse chiamate al database, quindi nel mio servizio inserisco il repository come dipendenza. Ora ho un codice facilmente testabile e ho separato le mie preoccupazioni, perché il mio servizio non sa come vengono eseguite le chiamate DB, ma chiama semplicemente le funzioni del repository che lo fa. Pertanto la logica aziendale e l'accesso ai dati sono separati. Questo sarebbe un approccio praticabile?
darophi

1
Se tutta la logica è scritta nei servizi, il controller chiamerà solo il servizio?
Islomkhodja Hamidullakhodjaev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.