Perché utilizziamo metodi CRUD ridondanti nei livelli di servizio e di persistenza?

1

Ho letto alcune frasi di questo .

Capisco che in parole semplici, il livello di persistenza (con i suoi oggetti repository) si occupa di CRUD di accesso ai dati di base . Il livello di servizio su contiene la logica aziendale. A mio avviso, un oggetto servizio contiene operazioni CRUD multiple da uno o più oggetti repository.

Ora stavo leggendo in un book (pagina 64) che non è considerato una buona pratica consentire agli oggetti del livello di presentazione (come i controller) di interagire direttamente con gli oggetti del repository.

Se ciò è corretto, significherebbe che ogni singola operazione CRUD semplice del repository dovrebbe avere un metodo "gemello" negli oggetti di servizio. Perché ? Non è ridondante? Cosa guadagniamo dal farlo?

    
posta Jason Krs 25.08.2017 - 01:55
fonte

1 risposta

5

Lo scopo di un livello di servizio è quello di fornire un livello di astrazione tra il livello di persistenza (operazioni CRUD) e il livello di presentazione.

Dato questo, non sorprende che stai trovando libri che dicono che non è una buona idea per il tuo livello di presentazione interagire direttamente con gli oggetti del tuo repository. L'intero punto del livello di servizio è quello di proteggerti dal dover interagire direttamente con il database; farlo ignorerebbe l'astrazione che cerchi.

Se stai fornendo un Service Layer tra il tuo client (il livello di presentazione) e il tuo database (cioè il repository), dovresti esporre i metodi nel tuo Service Layer che forniscono servizi , non CRUD operazioni. In effetti, puoi pensare al tuo livello di servizio come traduttore tra le operazioni CRUD e le pratiche commerciali.

Ad esempio, il tuo livello di servizio potrebbe esporre un metodo chiamato CreateInvoice() . Per fare ciò, questo metodo di servizio dovrebbe cercare Customer , Invoice Header , Invoice Line Item , Product e Pricing entità dal tuo repository. Fa tutto questo tramite operazioni CRUD. Ma non otterrai tutte queste entità come valore di ritorno; piuttosto, hai maggiori probabilità di ottenere una sorta di oggetto composito ViewModel che contenga una vista di tutti i dati richiesti per il rendering della fattura.

Quindi no, non passeresti semplicemente le tue chiamate CRUD all'API del Service Layer. Farlo è davvero ridondante e vanificherebbe l'intero scopo di avere un livello di servizio.

Ulteriori letture
P del catalogo EAA | Service Layer

    
risposta data 25.08.2017 - 02:23
fonte

Leggi altre domande sui tag