Sto lavorando su un'applicazione CRUD in Java (DropWizard). Ho scelto un'architettura stratificata piuttosto tipica con i seguenti livelli: Livello dominio (entità, DAO), Livello applicazione (servizi) e Livello presentazione (risorse Jersey, DTO e assemblatori).
La mia domanda riguarda la conversione tra entità di dominio e DTO. Per questo utilizzo un modello universale . Ora, ci sono alcune situazioni in cui un'entità è piuttosto complessa e sono richiesti pochi assemblatori. Ad esempio, un'entità utente può contenere un'entità Indirizzo e un'entità Immagine (avatar), quindi assemblare un DTO utente richiederebbe la chiamata a UserAssembler che a sua volta chiamerebbe AddressAssembler e ImageAssembler. Il codice cliente sarebbe simile a questo:
UserDTO userDTO = new UserAssembler().toDTO(user);
Ora, per semplificare i test delle unità, sarebbe meglio passare altri oggetti assembler in UserAssembler:
UserDTO userDTO = new UserAssembler(
new AddressAssembler(), new ImageAssembler())
.toDTO(user);
che non mi sembra già buono. Ma un altro dettaglio lo rende ancora peggiore.
Quando ImageAssembler
assembla un DTO ha bisogno di informazioni su un CDN per applicare un host CDN al percorso dell'immagine (l'entità del dominio dell'immagine non contiene questa informazione), quindi l'aspetto di ImageAssembler è simile a questo:
imageDTO.setUrl(cdnService.getUrlForImage(image.getPath()))
A quanto pare, ho bisogno di passare un riferimento a quel cdnService in un ImageAssembler. E dopo aver assemblato tutto, il codice client per l'assemblaggio di un utente assomiglia a questo:
UserDTO userDTO = new UserAssembler(
new AddressAssembler(), new ImageAssembler(cdnService))
.toDTO(user);
A me sembra pessimo: un sacco di codice, necessario passare il riferimento a cdnService ovunque io usi ImageAssembler.
Qualcun altro ha gli stessi problemi? Esistono approcci migliori per l'assemblaggio DTO? Forse sto facendo tutto sbagliato?
Grazie!