Avviso:
Il post è Spring
e Hibernate
specifico ma qualsiasi consiglio generico sarebbe utile anche.
Recentemente ho iniziato un progetto che contiene il seguente stack tecnologico Hibernate
, Spring MVC
e Angular2
.
Dopo aver letto un sacco di blog e tutorial, ho trovato che l'architettura pulita ha una buona serie di linee guida e ho imparato alcuni concetti chiave:
- La logica del dominio dovrebbe essere indipendente dai dettagli di implementazione.
- Le dipendenze devono essere rivolte verso l'interno.
- I confini di passaggio dei dati devono essere strutture di dati semplici.
Ho anche google alcuni concetti chiave:
- DAO, oggetti che comunicano con il database (non sono sicuro di averlo ottenuto al 100%).
- DTO, oggetti che attraversano i limiti dell'applicazione qualcosa come
JSON
?
In primavera abbiamo questo concetto di JPA annotation
e le entità che dovrebbero essere il cuore della logica aziendale funge anche da DAO
se non sbaglio.
Prendendo esempio di un'ipotetica applicazione Imagica
l'utente può caricare un'immagine, aggiungere tag e commenti ad essa. Il lato server contiene un controller per gestire le richieste di REST
.
Quindi, prendi un paio di scenari qui:
Carica immagine
L'utente carica un Image
con alcuni tag. Il front-end esegue una conversione dei dati e il mio controller ottiene i dati nel seguente formato:
{
id: null,
caption: string,
data: <base64 encoded>,
tags: List<id>
}
Domanda 1: posso dirlo come DTO
?
Spring esegue qualche conversione automatica in qualche modo e ottiene un nuovo oggetto creato dai dati JSON dati come parametro del metodo (penso che usi una libreria chiamata Jackson
), ho creato una classe per essa denominandola
ImageResource
.
@RequestMapping(value="", method=POST)
public void add(ImageResource resource) { ... }
Domanda 2: ImageResource
è anche un DTO
?
Il ImageController
è un semplice controllore che passa questo ImageResource
a ImageService
così com'è. Il ImageService
dipende da ImageEntity
e coppia Repositories
per il salvataggio di immagini e Tags
, ho scelto di non restituire nulla al salvataggio riuscito (forse restituire un nuovo ID è una buona idea).
Domanda 3: ImageEntity
funge da DAO
qui?
Ottenere tutti i dati dell'immagine
Ignora tutti i dettagli irrilevanti e sperando che sia ben compreso.
Domanda 4: ImageService
restituisce ImageListResource
e la conversione viene eseguita dal servizio stesso. Ho visto alcuni esempi in cui il servizio restituisce entità ma non sono sicuro che sia una strategia corretta.
Tornando alla domanda, di chi è la responsabilità di convertire in ImageListResource
, controller o servizio?