2014-04-09 18 views
5

Ho esaminato alcune domande correlate, ma ancora non vedo molta differenza tra un repository e un livello di servizio. Quindi, dato l'esempio, suppongo che dovrebbe assomigliare a questo, in caso contrario, dimmi perché?Differenza tra repository e livello di servizio

public interface ProductRepository extends CrudRepository<Product, Long>{ 

    public List<Product> findByName(String name); 
    public List<Product> findByPrice(Double price); 
} 

public interface ProductService { 

    public List<Product> findAll(); 
    public Product findById(Long id); 
    public Product save(Product product); 
    public void delete(Product product); 
    public List<Product> findByName(String name); 
    public List<Product> findByPrice(Double price); 
} 

e l'implementazione del ProductService utilizza il ProductRepository per implementare i metodi. Come ho capito da http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html le query per i metodi dal repository sono generati automaticamente. Nel mio esempio i metodi sono ripetuti nel repository e nel Servizio, quindi per favore spiega cosa/perché deve essere cambiato?

risposta

0

Per quanto ne so, il Repository è pensato per accedere direttamente al database. È qui che le chiamate dirette alle stored procedure o qualunque sia il meccanismo di archiviazione dei dati sarà.

Il livello di servizio è l'API per i dati. Di solito c'è un livello logico che vorresti ascoltare, o in un altro livello di astrazione tra il servizio e il repository.

Ad esempio, un sito Web chiama un metodo nel servizio. Il tuo servizio chiamerebbe il tuo repository per ottenere quei dati, quindi il tuo servizio lo trasformerebbe in qualche modo (costruisci oggetti, generi informazioni dinamiche basate su regole di business, ecc.) E poi passa di nuovo al sito web.

+0

Bene, quindi nel mio esempio i livelli di servizio e di assistenza sono corretti? E se ho alcuni metodi come ad esempio convalidare (Prodotto p) dovrebbe andare nel livello di servizio? – April

+0

Mi sembra a posto. È difficile da dire, dal momento che sono solo interfacce, ma basate sull'idea che il repository estende CrudRepo, che presumo abbia alcune funzioni di salvataggio/aggiornamento/cancellazione, che sembra corretto. Per quanto riguarda la validazione, sì, vorrei che fosse fatto sul livello di servizio. Di solito abbiamo una logica aziendale intermedia che gestisce cose del genere. Ad esempio, il servizio chiama la logica aziendale che chiama repo, ma dipende dalla dimensione del progetto. – JasonWilczak

4

Il livello del repository offre un ulteriore livello di astrazione sull'accesso ai dati. Il livello del repository espone le operazioni CRUD di base.

Il livello di servizio espone la business logic, che utilizza il repository.

Si può leggere una risposta più dettagliata qui: https://stackoverflow.com/a/5049454/1446006

1

Un repository è un modello di accesso ai dati in cui gli oggetti di trasferimento dati vengono trasferiti in un oggetto repository che gestisce le operazioni CRUD. Questo modello è utile in situazioni in cui il meccanismo dell'accesso ai dati può cambiare in modo significativo, ad es. ci si aspetta di avere diversi archivi di dati come Oracle in un'implementazione e SQL Server o anche HADOOP in un altro.

Un livello di servizio è un modello di logica aziendale comunemente utilizzato nelle architetture SaaS. L'utilizzo di un livello di servizio consente a una o più implementazioni di presentazione di accedere alla logica aziendale tramite un'interfaccia comune. Ad esempio, se si desidera che il proprio sito Web disponga di un'API, si utilizzerà un livello di servizio per implementare funzionalità di back-end comuni che il sito e l'API potrebbero utilizzare.

Il primo dovrebbe riguardare principalmente l'accesso ai dati e il secondo con la logica aziendale. Né sono obbligatori né devono accompagnarsi l'uno all'altro. Nelle applicazioni semplici entrambi i modelli possono essere implementati dalla stessa classe.

3

Tutta la logica aziendale deve essere nel livello di servizio.

Qualsiasi accesso al database (qualsiasi spazio di archiviazione) deve essere effettuato sul livello del repository.

Prendiamo un esempio. Devi salvare un'entità (Persona). Ma prima di salvare la persona, assicurati che il nome della persona non esista già.

Quindi la parte di convalida dovrebbe andare al livello aziendale.

nel livello di servizio

PersonRepository repository; 
public Person save(Person p){ 
    Person p = findByName(p.getName(); 
    if (p != null){ 
      return some customException(); 
    } 
    return repository.save(p); 
} 

public Person findByName(String name){ 
    return repository.findByName(name); 
} 

E nel tuo strato repository basta concentrarsi su DB funzionamento.

Si potrebbe averlo fatto nel livello del repository stesso. Supponiamo che tu l'abbia implementato nel tuo repository, quindi il tuo metodo di salvataggio controlla sempre prima di salvare (qualche volta potresti non doverlo fare).

Problemi correlati