Domanda

C'è un modo veramente pratico per evitare di utilizzare DTOS, quando il passaggio di dati attraverso metodi di servizi transazionali Hibernate sostenuti? In altre parole, sono DTOs l'unica soluzione non hacky per evitare problemi di inizializzazione pigri?

Credo che le due alternative popolari per DTOs e le ragioni non mi piace molto loro sono:

  1. Session Open in vista modello. Questo non mi piace come mi piacerebbe mantenere i metodi di servizio veramente transazionale (vale a dire la sessione Hibernate è impegnata e chiusa quando le uscite metodo). Questo è principalmente perché vorrei non devono preoccuparsi di transazioni se io per esempio bisogno di pubblicare il servizio come un servizio web più tardi.

  2. Il passaggio di oggetti di dominio / business attraverso metodi di servizio invece di DTOs e il caricamento diretto i necessari attributi / proprietà. Questo è un po 'meglio. Tuttavia in una gerarchia di oggetti di dominio non banale con le relazioni di entità complesse il recupero desiderosi deve finire da qualche parte. E quando lo fa, non riesco a vedere come questo non sarebbe girare molto rapidamente in un hackaton completa sostituzione degli enti con riferimento ids in tutto il luogo.

Mi sto perdendo qualcosa o sono DTOs infatti l'unico approccio solido dal punto di vista della manutenzione?

È stato utile?

Soluzione

L'unico modo per utilizzare realmente entità finali alla fine è quello di utilizzare qualcosa di un po 'più sofisticato di OpenSessionInView. Nella mia esperienza si sta andando ad avere per gestire manualmente la sessione di ibernazione a livello di applicazione. OpenSessionInView solo vi darà la stessa sessione per una richiesta. Dopo che avrete bisogno di essere costantemente riattaccare alla sessione corrente. Date un'occhiata a Seam e conversazioni, o implementare la propria gestione Hibernate Session. Attualmente gestiamo manualmente le nostre sessioni in base a quando una procedura guidata di inizio e fine e l'uso molla AOP per fissare sessioni per i fili giusti appena in tempo (sessioni non sono thread-safe, non un buon mix con AJAX)

WebServices d'altra parte certamente avranno bisogno di una qualche forma di DTO. Non vedo un modo per aggirare questo. Le entità possono apparire come POJO, ma non sono realmente, la serializzazione di loro può variare da difficile quasi impossibile. Basta creare DTOs che si adattano con l'obiettivo del metodo del servizio e da fare con esso.

Personalmente non credo che il modello DTO è terribile, se si sta solo facendo un sito web è fattibile andare end to end con entità e può anche comprare un po 'di prestazioni, ma se vuoi un'architettura più flessibile , bastone con DTOs.

Altri suggerimenti

Repositories, Services e controllori dovrebbero essere i luoghi che si occupano di vostro core applicazione (Hibernate Session può certamente essere usati come la totalità del vostro livello di repository, se vi piace).

Vista non dovrebbero avere a che fare con il vostro core dell'applicazione, il modello di dominio. Non dovrebbero avere a che fare con gli oggetti dal vivo, ma con un non-live, la rappresentazione su misura degli oggetti dal vivo. Vista dovrebbero essere consegnati solo i dati di cui hanno bisogno, in particolare formato ne hanno bisogno. Si dovrebbe costruire DTOs per le vostre opinioni. Questo modello è anche conosciuto come Vista Modello, in contrasto con Domain Model.

Per rendere la vita più facile, ci possono essere le librerie o framework che può auto-mappa dal tuo modello di dominio oggetti agli oggetti vista del modello, e schiena. NET, v'è un framework open source chiamato Automapper attualmente in sviluppo; Non sono sicuro di quello che c'è per Java.

Se ti rilassi la vostra esigenza di chiudere la sessione, è comunque possibile utilizzare sessione aperta in vista e solo impegnarsi tutto nelle tue transazioni di servizio. La sessione sarà ancora a disposizione dei pigri prelevare ma tutte le transazioni sarà completa. Ma se avete intenzione di passare a un servizio web, allora si avrebbe bisogno di carico desiderosi tutte le entità in ogni caso. DTOs solo ti costringono a carico consapevolmente ansiosi e prevenire la pigrizia accidentale.

Quindi, linea di fondo, se si sta attenti, si può saltare il DTOs in entrambi gli ambienti, ma probabilmente bastone con seduta pubblica in vista e preoccuparsi di servizi Web quando in realtà diventano un requisito.

Mi piace l'idea di DTOs, ma ho sempre pensato che non erano molto ben accettati o voluto da altri sviluppatori in quanto attuazione di tale approccio correttamente tutta la strada fino al database di solito richiede un grande sforzo. Questo è il motivo per cui ho creato Blaze-Persistenza Entity Visualizzazioni che consentono di modello DTOs come interfacce che mappano al modello entità JPA in modo efficiente. È possibile applicare una vista un'entità a una query e la query sarà adattato in un modo che sarà solo recuperare lo stato effettivamente necessaria, piuttosto che tutti lo stato e la mappa che in Java.

Utilizzando visualizzazioni di entità non è necessario la sessione aperta in visualizzazione anti-modello, perché la struttura desiderata viene caricato con entusiasmo. Poiché non ci sono oggetti coinvolti nessuna entità, ci saranno anche problemi pigro carico.

Dato che il modello di entità spesso è così simile al modello DTO in prime fasi di sviluppo, vedo spesso gli sviluppatori di saltare la creazione di un modello di DTO separata mentre cercano di evitare il fastidio. Non appena le preoccupazioni trasversali come auditing, statistiche o denormalizations terreni nel modello entità o la quantità di dati nel modello di entità cresce molto più grande di quello che effettivamente serve per casi d'uso del soggetto, gli sviluppatori di incorrere in problemi.

Di sicuro come un blog postare su tale questione ho scritto qualche tempo fa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top