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?