Sto creando un'applicazione Web che costituisce principalmente operazioni CRUD di dati dal back-end/database. Ci sono casi in cui devo scrivere una logica di business (sono sicuro che avremo più logiche di business costruite man mano che approfondiremo lo sviluppo). Attualmente per ogni schermata dell'interfaccia utente che sto creando, creo una classe modello, una classe Service, una classe DAO, un controller (è essenzialmente un servlet) e un mucchio di pagine jsp. Nella maggior parte dei casi, la classe di servizio chiama solo i metodi DAO per passare gli oggetti del modello. In sostanza, utilizziamo le classi del modello per mappare i dati dagli schermi dell'interfaccia utente. Quindi il controllore avrà gli oggetti del modello popolati quando viene inviato un modulo. Ho iniziato a utilizzare le classi di servizio per mantenere un livello di separazione dal livello Web al livello DAO. Ma a volte penso che la classe di servizio stia semplicemente aggiungendo un livello non necessario di chiamate API, penserei che potrei semplicemente iniettare il DAO nel controller e completare l'attività più velocemente. Voglio utilizzare la classe di servizio solo quando è necessario eseguire una business logic aggiuntiva. Se devi progettare un'applicazione, quali fattori consideri utilizzando controller-> DAO vs controller-> Servizio-> flusso di controllo DAO?Utilizzo di servizi e DAO nel controller mvc di primavera
risposta
I DAO sono più granulari e si occupano di un'entità specifica. I servizi forniscono funzionalità a livello di macro e possono finire per utilizzare più di un DAO. In genere, i servizi vengono utilizzati per definire i limiti delle transazioni per ottenere l'atomicità. In altre parole, se si termina l'aggiornamento di più tabelle utilizzando più DAO, la definizione del limite di transazione al servizio consentirà di eseguire il commit o il rollback di tutte le modifiche apportate al DB.
Nella progettazione, poiché si esegue principalmente CRUD per varie entità, potrebbe sembrare che i servizi non aggiungano molto valore. Tuttavia, considera il front-end basato sul Web come un modo per aggiornare i dati. L'utilizzo dei servizi ti consentirà di esporre le stesse funzionalità di un servizio web in seguito ad altre forme di client come integratori di terze parti, ecc.
Quindi, in sintesi, il tuo progetto sembra essere in linea con le pratiche convenzionali. Se ritieni di poter combinare più servizi in uno basato su un tema comune, in modo da ridurre il sovraccarico di codice, devi procedere e farlo. Alla fine della giornata, l'obiettivo finale è quello di creare un codice gestibile che nessuno ha paura di cambiare quando si presenta la necessità.
"Uso dei servizi" non hai bisogno di una classe di servizio per restituire una lista semplice/eseguire un lavoro grossolano o esporre come un riposante-api. Hai bisogno di classi di servizio serpate quando manipoli più entità interagenti. – NimChimpsky
Avrai bisogno di servizi anche quando offri app esterne. Immagina di avere un servizio web che fornisce dati per un'app Android. È possibile creare un livello di servizio che otterrà i dati e restituirà DTO (oggetti di trasferimento dati) per un livello dell'adattatore che gestisce le richieste REST e trasforma tali DTO in JSON o XML da inviare all'app Android. – dgimenes
avrei riferisco la mia risposta here
Il lungo e breve di esso è il vantaggio di utilizzare un livello di servizio è che ti dà spazio per muoversi in futuro, se si vuole fare qualcosa con Primavera di sicurezza e ruoli ecc. Ti permette di gestire le transazioni in modo più atomico e Spring stessa ha annotazioni davvero belle per questo.
Quindi devi passare attraverso i dolori di scaricare i tuoi dubbi DAO dai tuoi controller. Se i tuoi controller sono pesantemente collegati ai tuoi DAO, questo è più lavoro in futuro se non hai già creato un livello di servizio. – david99world
Perché il servizio dovrebbe fornire una separazione dei problemi http://en.wikipedia.org/wiki/Separation_of_concerns. Sarebbe una cattiva pratica ignorare quella facciata del servizio e andare direttamente al DAO dal controller se hai introdotto un livello di servizio. Anche se inizialmente dovresti infrangere la regola DRY non avendo inizialmente bisogno di un livello di servizio, il fatto sarebbe che il SoC sarebbe più doloroso in futuro per qualsiasi refactoring. – david99world
Ho intenzione di lasciarlo qui http://stackoverflow.com/questions/3688664/simple-spring-app-why-use-service-layer#answer-3688779 perché in sostanza riassume il mio ragionamento sul perché avere un il livello di servizio per un'applicazione che potrebbe crescere in complessità è una buona idea. – david99world
Utilizzare una classe di servizio quando si ha a che fare con più di uno aggregate root.
Inject repositories (ovvero un dao che restituisce una raccolta) o dao direttamente nel controller, non è necessario un layer/classe extra per eseguire un get di base.
Utilizzare solo classi di servizio dove necessario, altrimenti si dispone del doppio del codice richiesto.
È possibile creare un repository generico, e annoato con @Transactional(propagation = Propagation.REQUIRED)
che applica una transazione, ma non ne creerà uno nuovo se già presente. Quindi, se in seguito utilizzi più repository in un metodo di classe di servizio, avrai solo una transazione.
In Pro-Spring-3 book hanno accennato sotto la linea, per il controller con JPA2
Once the EntityManagerFactory had been properly configured, injecting it into your service layer classes is very simple.
e stanno usando la stessa classe di servizio e repository come in seguito:
package com.apress.prospring3.ch10.service.jpa;
// Import statements omitted
@Service("jpaContactService")
@Repository
@Transactional
public class ContactServiceImpl implements ContactService {
private Log log = LogFactory.getLog(ContactServiceImpl.class);
@PersistenceContext
private EntityManager em;
// Other code omitted
}
ma nel caso in cui si utilizzi il CRUDRepository o il JPARepository di dati primari, il DAO sarà Interfaccia e sarà necessario creare un livello di servizio per gestire il codice
- 1. Concetti DTO e DAO e MVC
- 2. PathVariable nel controller primavera
- 3. Primavera 3.0 MVC MVC: tag view-controller
- 4. metodo simultaneo voce nel controller di primavera
- 5. come ottenere getServletContext() in primavera controller mvc
- 6. Controller MVC .NET con più repository e servizi?
- 7. Controller MVC di primavera Parametri di query HTTP GET
- 8. Durata del controller in primavera MVC
- 9. messaggio JSON alla primavera del controller MVC
- 10. Ricerca locale dal controller in primavera MVC
- 11. Utilizzo di @Version nel progetto di dati di primavera
- 12. Utilizzo di DAO con gli oggetti compositi
- 13. Asp.Net MVC e servizi Web
- 14. JPA Aggiornamento di massa/batch in primavera MVC
- 15. Primavera di sicurezza @PreAuthorize sui controller
- 16. Utilizzo di DAO verde con provider di contenuti
- 17. utilizzo primavera di messaggi typeMismatch
- 18. Utilizzo del principio di separazione Command-Query nei controller MVC
- 19. Utilizzo di Spring Validator sui servizi Web
- 20. Utilizzo dei metodi di azione ASP.NET MVC
- 21. Carica immagine in primavera mvc
- 22. primavera convenzioni di mappatura richiesta MVC
- 23. controller Primavera + Ajax tornare stringa
- 24. Codifica UTF-8 con modulo post e controller di primavera
- 25. Gestione delle eccezioni nel controller (ASP.NET MVC)
- 26. Auto generate azione nel controller MVC
- 27. Corrente di accesso Modello in primavera-mvc
- 28. Applicazione Web MVC di primavera - abilitazione/disabilitazione del controller dalla proprietà
- 29. Modello DAO e oggetti modello
- 30. Primavera Secuirty OAuth 2 - molteplici servizi di autenticazione di utenti
Sono entrato in un progetto già esistente quando ho iniziato il mio attuale lavoro. Sono qui da poco più di un anno. Onestamente, ho appena realizzato che ci dovrebbe essere un livello separato per l'iniezione di DAO. Il progetto al lavoro li inietta semplicemente nei controller. Ora che lo so, e sono pronto per il beneficio dell'atomicità, penso che avere un livello di servizio sarebbe stato positivo poiché abbiamo più entità che interagiscono nell'intera applicazione. – theblang