Sto basando questa domanda su Fowler PoEAA. Data la familiarità con questo testo, i ViewModels utilizzati in ASP.NET MVC non sono gli stessi di DTO? Perché o perché no? Grazie.Qual è la differenza tra un modello di visualizzazione e un oggetto di trasferimento dati?
risposta
Hanno lo stesso scopo (incapsulare i dati per un altro livello dell'applicazione) ma lo fanno in modo diverso e per diversi motivi.
Lo scopo di un DTO è quello di ridurre il numero di chiamate tra livelli di un'applicazione, specialmente quando tali chiamate sono costosi sistemi (ad esempio distribuiti). Le DTO sono quasi sempre banalmente serializzabili e quasi mai contengono alcun comportamento.
Ad esempio, stai sviluppando un sito di e-commerce.
CreateCustomer
eAddCustomerAddress
sono operazioni separate a livello di database, ma per motivi di prestazioni si potrebbe voler aggregare i propri dati in unNewCustomerWithAddressDto
in modo che il client debba solo effettuare un viaggio di andata e ritorno al server, e non deve preoccuparsi che il il server potrebbe fare un sacco di cose diverse con il pacchetto di dati.Il termine "ViewModel" indica cose leggermente diverse in diversi tipi di MV *, ma il suo scopo è principalmente la separazione delle preoccupazioni. Il tuo modello è spesso ottimizzato per scopi diversi dalla presentazione ed è responsabilità del ViewModel disaccoppiare la tua vista dai dettagli di implementazione del modello. Inoltre, la maggior parte dei modelli MV * consiglia di rendere le tue visualizzazioni "stupide" il più possibile, e quindi il ViewModel a volte si assume la responsabilità della logica di presentazione.
Ad esempio, nella stessa applicazione di e-Commerce, il tuo
CustomerModel
è la "forma" sbagliata per la presentazione sulla vista "Nuovo cliente". Per i principianti, la tua vista ha due campi modulo per l'utente per inserire e confermare la password, e il tuoCustomerModel
non contiene affatto un campo password! Il tuoNewCustomerViewModel
conterrà quei campi e potrebbe, a seconda del tuo gusto di MV *, essere responsabile di alcune logiche di presentazione (ad es. Per mostrare/nascondere parti della vista) e della convalida di base (ad esempio assicurandosi che entrambi i campi della password corrispondano).
Lo scopo è diverso:
- DTO sono usati per trasmettere dati
- ViewModels vengono utilizzate per mostrare i dati a un utente finale.
Quindi normalmente ViewModels contiene i dati di presentazione, in molti casi è simile a quello presente in un DTO, ma con alcune differenze. Pensa alla rappresentazione di enumerazioni, localizzazione, valuta, formati data, .... Questo perché normalmente non dovrebbe esserci alcuna logica nella tua vista.
DTOs in MVVM e MVP sono di solito oggetti molto Dumb e sono fondamentalmente solo un mucchio di setter di proprietà e getter. I ViewModels d'altra parte possono avere qualche comportamento.
Un pratico effetto collaterale positivo dell'utilizzo di DTO consente una serializzazione più semplice. Se hai un oggetto piuttosto complesso, ad esempio C#, spesso ti ritrovi a dover disattivare selettivamente le cose che non vuoi serializzare. Questo può diventare piuttosto brutto e DTO semplifica questo processo.
+1, la differenza chiave è che i DTO sono stupidi (e quindi banalmente serializzabili, che è il loro * lavoro *), e ViewModels può contenere la logica che altrimenti sarebbe andata nella tua vista (che è * il loro * lavoro). –
@Igor Zevaka Puoi spiegare cosa intendi per comportamento? –
Un modello di vista e un oggetto di trasferimento dati presentano somiglianze e differenze.
analogo: Trasferire i dati in un record (istanza di oggetto, forse serializzati) ad un ricevitore, sia una vista o un servizio
Differenza: una vista del modello è destinato ad essere inviato a una vista, dove sarà visualizzato, con la formattazione. Un modello di vista invia inoltre i dati a un controller. Un DTO di solito non è inteso per la presentazione. È inteso per inviare dati grezzi.
- 1. Qual è la differenza tra modello dati e modello oggetto?
- 2. Qual è la differenza tra un array e un oggetto?
- 3. Qual è la differenza tra un modello e un percorso?
- 4. Qual è la differenza tra un tema e un modello?
- 5. qual è la differenza tra modello di visitatore e strategia?
- 6. Qual è la differenza tra un controller e un servizio?
- 7. Qual è la differenza tra un indice tabella e un indice di visualizzazione?
- 8. Qual è la differenza tra un pacchetto e un intento?
- 9. La differenza tra un modello Eloquent e un modello?
- 10. Test Angular2: Qual è la differenza tra un oggetto DebugElement e un oggetto NativeElement in ComponentFixture?
- 11. Qual è la differenza tra un oggetto funzione e un oggetto callable?
- 12. Qual è la differenza tra un 'Tipo' e di un 'oggetto' in Python
- 13. Qual è la differenza tra un tipo di dati astratto (ADT) e una struttura dati?
- 14. Qual è la differenza tra un algoritmo e un metodo
- 15. Qual è la differenza tra un "nonce" e un "GUID"?
- 16. Qual è la differenza tra un helper e un parziale?
- 17. Qual è la differenza tra un JavaBean e un POJO?
- 18. Qual è la differenza tra un vettore e un vertice?
- 19. Qual è la differenza tra un dizionario e un array?
- 20. Qual è la differenza tra un RoutedCommand e un RoutedUICommand?
- 21. Qual è la differenza tra un REPL e un interprete?
- 22. Qual è la differenza tra un nodo e un vertice?
- 23. Che cos'è un DTO e BO? Qual è la differenza?
- 24. Un oggetto di trasferimento dati è uguale all'oggetto valore?
- 25. Qual è la differenza tra il modello di funzione e la funzione di modello?
- 26. Qual è la differenza tra una chiusura e un modulo?
- 27. Differenza tra visualizzazione e modello in Grails
- 28. Qual è la differenza tra NSCFString e NSConstantString?
- 29. Qual è la differenza tra un oggetto differito e il suo oggetto promessa?
- 30. Qual è la differenza tra oggetto e riferimento?
Questa è una spiegazione eccellente! Fino ad ora gli unici modelli di visualizzazione che avevo visto avevano solo getter e setter, quindi ero tipo: wow è molto simile a un DTO. Grazie per aver chiarito questo per me. – mkelley33