Domanda Qual è la differenza tra un modello di visualizzazione e un oggetto di trasferimento dati?


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.


44
2017-09-16 07:13


origine


risposte:


Hanno uno scopo simile (incapsulare i dati per un altro livello dell'applicazione) ma lo fanno in modo diverso e per ragioni diverse.

  • Lo scopo di un DTO è ridurre il numero di chiamate tra i livelli di un'applicazione, specialmente quando tali chiamate sono costose (ad esempio sistemi distribuiti). Le DTO sono quasi sempre banalmente serializzabili e quasi mai contengono alcun comportamento.

    Ad esempio, stai sviluppando un sito di e-commerce. CreateCustomer e AddCustomerAddress sono operazioni separate a livello di database, ma per motivi di prestazioni si potrebbe voler aggregare i propri dati in a NewCustomerWithAddressDto in modo che il tuo cliente debba solo fare un viaggio di andata e ritorno verso il server, e non ha bisogno di preoccuparsi che il server possa fare un sacco di cose diverse con il pacchetto di dati.

  • Il termine "ViewModel" significa 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, la tua CustomerModel è la "forma" sbagliata per la presentazione sulla tua vista "Nuovo cliente". Per i principianti, la tua vista ha due campi modulo per il tuo utente per inserire e confermare la loro password, e il tuo CustomerModel non contiene affatto un campo password! Il tuo NewCustomerViewModel 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 assicurando che entrambi i campi della password corrispondano).


75
2017-09-16 07:28



Di solito sono presenti DTO in MVVM e MVP Oggetti molto stupidi e sono fondamentalmente solo un gruppo di coloni e proprietari di proprietà. I ViewModels d'altra parte possono avere qualche comportamento.

Un effetto collaterale positivo pratico di avere DTO è consentire una serializzazione più facile. 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.


13
2017-09-16 07:52



Lo scopo è diverso:

  • I DTO sono usati per trasferire i dati
  • ViewModels vengono utilizzati per mostrare i dati a un utente finale.

Quindi normalmente ViewModels contiene i dati di presentazione, in molti casi è simile a quello che si trova 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.


12
2017-09-16 07:18



Un modello di visualizzazione e un oggetto di trasferimento dati presentano somiglianze e differenze.

Simile:    Trasferisci i dati in un record (istanza dell'oggetto, magari serializzata) in un destinatario, se una vista o un servizio

Differenza:   Un modello di vista deve essere inviato a una vista, dove verrà 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
2018-01-24 19:33