Conversioni tra tipi di oggetto tra limiti dell'applicazione

2

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:

  1. La logica del dominio dovrebbe essere indipendente dai dettagli di implementazione.
  2. Le dipendenze devono essere rivolte verso l'interno.
  3. I confini di passaggio dei dati devono essere strutture di dati semplici.

Ho anche google alcuni concetti chiave:

  1. DAO, oggetti che comunicano con il database (non sono sicuro di averlo ottenuto al 100%).
  2. 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?

    
posta CodeYogi 10.11.2017 - 17:48
fonte

1 risposta

1

Question 1: can I say it as DTO?

Questo non è un oggetto, solo dati serializzati che provengono dall'input dell'utente attraverso una richiesta web.

Question 2: ImageResource is also a DTO?

Non ho familiarità con Spring, ma dalla tua spiegazione mi sembra che questa sia solo una funzione di supporto che deserializza l'input della domanda 1 in una classe personalizzata definita dall'utente. Quindi, questo ImageResource è solo un riflesso delle informazioni della domanda 1, che sono solo input di base da parte dell'utente; questo non è ancora il tuo modello di dominio.

Quando lo converti in un ImageEntity e lo passi al tuo servizio, questo è un DTO, che attraversa il confine dall'app Web e dall'applicazione principale.

Question 3: Is ImageEntity acting as DAO here?

Penso che i repository citati agiscano come DAO (oggetto di accesso ai dati), poiché svolgono il lavoro di persistenza e recuperano le informazioni necessarie dal DB.

Question 4: ... whose responsibility it is to convert to ImageListResource, controller or service?

Se il servizio che hai menzionato fa parte della tua applicazione principale, non dovrebbe eseguire la conversione; deve essere fatto da parte specifica del tuo cliente. In questo caso, penso che per il controller sia corretto convertire i dati in un formato appropriato per il client.

    
risposta data 10.11.2017 - 18:09
fonte