2009-12-30 11 views
78

Sto usando NHibernate per mantenere i miei oggetti di dominio. Per semplificare le cose, sto utilizzando un progetto MVC ASP.NET sia come livello di presentazione sia come livello di servizio.DTO = ViewModel?

Desidero restituire gli oggetti dominio in XML dalle classi del mio controller. Dopo aver letto alcuni post qui su Stack Overflow, raccolgo che le DTO sono la strada da percorrere. Tuttavia, ho anche trovato post che parlano di ViewModel.

La mia domanda: gli oggetti di trasferimento dati e ViewModels sono la stessa cosa? O è un ViewModel una specie di sottotipo di un DTO?

+7

Penso che sia importante menzionare che ViewModels in ASP.NET MVC non sono equivalenti al 100% a ViewModels in WPF (MVVM), poiché la maggior parte delle risposte menziona MVVM e si sta lavorando con ASP.NET MVC. –

risposta

73

La definizione canonica di un DTO è la forma dei dati di un oggetto senza alcun comportamento.

ViewModels sono il modello della vista. I ViewModels in genere sono dati completi o parziali di uno o più oggetti (o DTO) più eventuali membri aggiuntivi specifici per il comportamento della vista (metodi che possono essere eseguiti dalla vista, proprietà per indicare come attivare gli elementi di visualizzazione ecc ...). Puoi guardare il modello di vista come tutti i dati per una vista più i comportamenti. ViewModels può o meno mappare uno a uno a oggetti business o DTO.

A proposito, NHibernate projections è utile se un determinato modello ha bisogno di un sottoinsieme di dati da un oggetto persistente.

6

Per alcune semplici visualizzazioni userò il mio DTO come i miei modelli, ma visto che le viste diventano più complesse creerò ViewModels.

Per me è un equilibrio tra rapidità (usando DTO, dato che ce l'ho già) e flessibilità (creare ViewModels significa più separazione delle preoccupazioni).

+2

Buona risposta pragmatica. –

27

DTO! = ViewModel

Nel modello MVVM il ViewModel è utilizzato per isolare il modello dalla vista. Per rappresentare il modello, è possibile utilizzare semplici classi DTO, che vengono nuovamente associate a un database tramite ad es. NHibernate. Ma non ho mai visto una classe ViewModel modellata come DTO. Le classi ViewModel hanno per lo più un comportamento, che i DTO non hanno.

+2

quindi DTO può essere solo struct (o è una classe che dovrebbe imitare le capacità di una struct)? –

16

DTO - Gli oggetti Data Transfer sono esattamente come si dice, contenitori per il trasferimento dei dati. Non hanno un comportamento, ma solo un gruppo di setter e getter. Alcune persone li rendono immutabili e basta crearne di nuovi quando necessario piuttosto che aggiornare quelli esistenti. Dovrebbero essere serializzabili per consentire il trasferimento attraverso il filo.

Generalmente i DTO vengono utilizzati per spedire i dati da un livello a un altro livello oltre i limiti del processo poiché le chiamate a un servizio remoto possono essere costose in modo che tutti i dati richiesti vengano trasferiti in un DTO e trasferiti al client in un blocco (a grana grossa).

Tuttavia, alcune persone usano la nozione di DTO con schermo (niente a che fare con i confini del processo di attraversamento). Ancora una volta questi sono popolati con i dati richiesti (generalmente i dati richiesti per una determinata schermata e potrebbero essere un'aggregazione di dati da varie fonti) e inviati al cliente.

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

Nei casi semplici come già precisato questo DTO può essere utilizzato per il legame alla vista ma nei casi più complessi che richiederebbe la creazione di un ViewModel e scarico dei dati da DTO a ViewModel che è ovviamente più lavoro (quando si applica il pattern MVVM).

Così ancora una volta, come già detto DTO! = ViewModel

e

DTO e ViewModel hanno scopi diversi nella vita

46

ViewModel in ASP.NET MVC pratica è lo stesso del DTO, tuttavia ViewModel nel pattern MVVM è diverso da DTO perché ViewModel in MVVM ha comportamenti ma DTO non ha.

+4

Questa è una bella risposta; anche se a corto di dettagli. – Phil

+3

Perché il ViewModel in asp.net mvc deve essere uguale a un DTO? Non ha senso. Un ViewModel può avere un comportamento non conforme al DTO. Questo non dipende da mvc. – Elisabeth

+4

+1 per differenziare tra ASP.NET MVC ViewModel e MVVM ViewModel. – Ronald

10

In primo luogo, la principale differenza è che ViewModel può avere comportamenti o metodi che DTO non deve !!!

In secondo luogo, l'utilizzo di DTO come ViewModel in ASP.NET MVC rende l'applicazione strettamente accoppiata a DTO e questo è esattamente lo scopo opposto dell'utilizzo di DTO. In tal caso, qual è la diffrenza utilizzando il modello di dominio o DTO, più complessità per ottenere un anti-pattern?

Anche ViewModel in ASP.NET può utilizzare DataAnnotations per la convalida.

Lo stesso DTO può avere un diverso ViewModels Mapping e One ViewModel può essere composto da diversi DTO (sempre con mappatura oggetto non composizione). perché penso che sia anche peggio se hai un ViewModel che contiene un DTO, avremo lo stesso problema.

Dal tuo livello di presentazione, pensa a DTO come un contratto, riceverai un oggetto che devi considerare estraneo alla tua applicazione e non hai alcun controllo su di esso (anche se hai già il servizio, il dto e gli strati di presentazione sono tuoi).

Infine, se si esegue questa separazione netta, gli sviluppatori possono lavorare insieme con facilità. La persona che progetta ViewModels, Views e Controllers non deve preoccuparsi del livello di servizio o dell'implementazione DTO perché eseguirà il mapping quando gli altri sviluppatori completeranno la loro implementazione ... Può persino usare lo strumento Mocking o il mocking manuale per riempire il livello di presentazione con i dati per il test.

+0

Ho appena installato VS 2012 e ho esaminato l'applicazione per pagina singola MVC 4. Nel progetto di esempio, i DTO vengono utilizzati come parametri per i metodi (o le azioni) del controller in WebApi.In altre parole, JSON viene pubblicato in questi metodi e con alcuni magic MVC, i dati vengono automaticamente convertiti in DTO prima di essere passati ai metodi. Pensi che sia sbagliato usare DTO in questo caso. ViewModels dovrebbe essere utilizzato con un'API Web? Sto chiedendo di capire meglio, perché non sono ancora così familiare con questi concetti. –

+0

Salut Jean-François Beauchamp :) ASP.NET MVC può analizzare i messaggi di posta elettronica in un oggetto, ad esempio: supponiamo di avere questo mapping su un metodo Index ajax/index/{jobID}/{ResultsToSkip}/{ResultsToSend} " invece di avere nell'indice controlle (int jobID, int ResultsToSkip, int ResultsToSend) Avrò Index (richiesta) (richiesta è un oggetto che incapsula 3 campi jobID ...) Quindi ora invece di parametri con cui stai parlando la tua appicazione con oggetti che incapsulano DATA, quindi sì possiamo dire requestDTO. Ad esempio devi aggiungere un altro campo per modificare solo il DTO, non i metodi di interfaccia api. –

0

se si utilizzerà DTO come ViewModel, ciò significa che si sta facendo molto affidamento su DTO perché per qualche motivo si sta modificando DTO, quindi potrebbe avere un impatto su ViewModel.

Migliore utilizzo DTO & convertire in viewmodel.