DTO = ViewModel?


102

Estoy usando NHibernate para conservar los objetos de mi dominio. Para simplificar las cosas, estoy usando un proyecto ASP.NET MVC como capa de presentación y capa de servicio.

Quiero devolver mis objetos de dominio en XML desde mis clases de controlador. Después de leer algunas publicaciones aquí en Stack Overflow, creo que los DTO son el camino a seguir. Sin embargo, también me he encontrado con publicaciones que hablan sobre ViewModel.

Mi pregunta: ¿Los objetos de transferencia de datos y los modelos de vista son lo mismo? ¿O es un ViewModel una especie de subpatrón de un DTO?


9
Creo que es relevante mencionar que ViewModels en ASP.NET MVC no son 100% equivalentes a ViewModels en WPF (MVVM), ya que la mayoría de las respuestas mencionan MVVM y usted está trabajando con ASP.NET MVC.
Matthijs Wessels

Respuestas:


104

La definición canónica de un DTO es la forma de datos de un objeto sin ningún comportamiento.

ViewModels son el modelo de la vista. Los ViewModels suelen ser datos completos o parciales de uno o más objetos (o DTO) más cualquier miembro adicional específico del comportamiento de la vista (métodos que la vista puede ejecutar, propiedades para indicar cómo alternar los elementos de la vista, etc.). Puede ver el modelo de vista como todos los datos de una vista más comportamientos. ViewModels puede o no mapear uno a uno a objetos comerciales o DTO.

Por cierto, las proyecciones de NHibernate son útiles si un determinado modelo de vista necesita un subconjunto de los datos de un objeto persistente.


¿Puede explicar esto: "DTO es la forma de datos de un objeto sin ningún comportamiento"?
roozbeh S

2
Es decir ... la clase DTO generalmente solo contiene propiedades y no contiene ningún método con lógica empresarial, etc.
Daniel Auger

71

La práctica ViewModel en ASP.NET MVC es la misma que en DTO, sin embargo, ViewModel en el patrón MVVM es diferente de DTO porque ViewModel en MVVM tiene comportamientos pero DTO no.


4
Esta es una buena respuesta; aunque corto en detalles.
Phil

5
¿Por qué ViewModel en asp.net mvc debería ser el mismo que un DTO? Eso no tiene sentido. Un ViewModel puede tener un comportamiento que un DTO no. Esto no depende de mvc.
Elisabeth

8
+1 para diferenciar entre ASP.NET MVC ViewModel y MVVM ViewModel.
Ronald

5
@Elisa: la respuesta a su pregunta bastante antigua es que en ASP.NET MVC, la vista invoca Acciones en el controlador (no un ViewModel) para cambiar el Modelo y la Vista sin estado. Debido a esto, un DTO con forma de vista es esencialmente lo mismo que ViewModel. Sin embargo, en sistemas más grandes con otro límite de serialización, un DTO puede ser beneficioso si está separado de un ViewModel diseñado específicamente para la Vista.
dansan

27

DTO! = ViewModel

En el patrón MVVM , ViewModel se usa para aislar el modelo de la vista. Para representar el modelo, puede usar clases DTO simples , que nuevamente se asignan a una base de datos a través de, por ejemplo, NHibernate. Pero nunca he visto una clase ViewModel que esté modelada como un DTO. Las clases ViewModel en su mayoría tienen comportamiento, que los DTO no tienen.


2
Entonces, ¿los DTO pueden ser solo estructuras (o es una clase que debería imitar las capacidades de una estructura)?
Max Alexander

20

DTO: los objetos de transferencia de datos son exactamente como dice, contenedores para transferir datos. No tienen comportamiento, sino simplemente un grupo de setters y getters. Algunas personas los hacen inmutables y simplemente crean nuevos cuando es necesario en lugar de actualizar los existentes. Deben ser serializables para permitir la transferencia a través del cable.

Generalmente, los DTO se utilizan para enviar datos de una capa a otra a través de los límites del proceso, ya que las llamadas a un servicio remoto pueden ser costosas, por lo que todos los datos necesarios se envían a un DTO y se transfieren al cliente en un solo fragmento (granulado grueso).

Sin embargo, algunas personas usan la noción de DTO vinculados a la pantalla (nada que ver con cruzar los límites del proceso). Nuevamente, estos se completan con los datos requeridos (generalmente los datos requeridos para una pantalla en particular y podrían ser una agregación de datos de varias fuentes) y se envían al cliente.

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

En casos simples, como ya se ha dicho, este DTO se puede usar para enlazar a la vista, pero en casos más complejos requeriría la creación de un ViewModel y la descarga de datos de DTO a ViewModel, lo que obviamente es más trabajo (cuando se aplica el patrón MVVM) .

Así que de nuevo como ya se dijo DTO! = ViewModel

y

DTO y ViewModel tienen diferentes propósitos en la vida


13

Primero, la principal diferencia es que ViewModel puede tener comportamientos o métodos que DTO no debe.

En segundo lugar, el uso de DTO como ViewModel en ASP.NET MVC hace que su aplicación esté estrechamente acoplada a DTO y ese es exactamente el propósito opuesto al uso de DTO. Si lo hace, ¿cuál es la diferencia usando su modelo de dominio o DTO, más complejidad para obtener un anti-patrón?

También ViewModel en ASP.NET puede usar DataAnnotations para la validación.

El mismo DTO puede tener diferentes ViewModels Mapping, y One ViewModel puede estar compuesto de diferentes DTO (siempre con mapeo de objetos, no composición). porque creo que es aún peor si tiene un ViewModel que contiene un DTO, tendremos el mismo problema.

Desde su capa de presentación, piense en DTO como un contrato, recibirá un objeto que debe considerar como extraño para su aplicación y no tiene ningún control sobre él (incluso si tiene ex el servicio, el dto y las capas de presentación son tuyos).

Finalmente, si realiza esta separación limpia, los desarrolladores pueden trabajar juntos con facilidad. La persona que diseña ViewModels, Vistas y Controladores no tiene que preocuparse por la capa de servicio o la implementación de DTO porque hará el mapeo cuando los demás desarrolladores terminen su implementación ... Incluso puede usar la herramienta Mocking o la simulación manual para completar la capa de presentación con datos para prueba.


1
Acabo de instalar VS 2012 y miré la aplicación MVC 4 de una sola página. En el proyecto de muestra, los DTO se utilizan como parámetros para los métodos (o acciones) del controlador en WebApi. En otras palabras, JSON se publica en esos métodos y, con algo de magia MVC, los datos se convierten automáticamente en DTO antes de pasar a los métodos. ¿Crees que es incorrecto utilizar DTO en este caso? ¿Deben usarse ViewModels con una API web? Pido una mejor comprensión, porque todavía no estoy muy familiarizado con estos conceptos.
Jean-François Beauchamp

Salut Jean-François Beauchamp :) ASP.NET MVC puede analizar los carritos de url en un objeto, por ejemplo: supongamos que tengo esta asignación a un método de índice ajax / index / {jobID} / {ResultsToSkip} / {ResultsToSend} "en lugar de tener en el control Index (int jobID, int ResultsToSkip, int ResultsToSend) tendré Index (solicitud) (la solicitud es un objeto que encapsula 3 campos jobID ...) Así que ahora, en lugar de parámetros, estás hablando con tu aplicación con objetos que encapsulan DATOS, por lo que sí podemos decir requestDTO Por ejemplo, usted tiene que agregar otro campo se cambia sólo el DTO, no los métodos de la interfaz API..
riadh gomri

9

Para algunas vistas simples, usaré mi DTO como mis modelos, pero a medida que las Vistas se vuelvan más complejas, crearé ViewModels.

Para mí es un equilibrio entre rapidez (usando DTO, ya que ya los tengo) y flexibilidad (crear ViewModels significa más separación de preocupaciones).


2
Buena respuesta pragmática.
Simon Tewsi

0

Si va a utilizar DTO como ViewModel, eso significa que está haciendo una gran dependencia de DTO debido a alguna razón por la que está cambiando DTO, entonces podría afectar a ViewModel.

Mejor use DTO y conviértalo en modelo de vista.


-1

Podemos usar DTOigual que la clase Model y podemos usar viewmodel cuando necesitamos mostrar / usar múltiples datos / propiedades de modelos en una sola vista. Ejemplo: primero creo un modelo usando la base de datos del marco de la entidad. Entonces, ahora todo el modelo se genera en función de la base de datos. y ahora necesitamos la anotación de datos, para esa anotación de datos podemos crear una carpeta con el nombre DTO. En esta carpeta DTO, podemos mantener exactos todos los modelos que ya generan y agregar anotaciones de datos encima de la propiedad. Entonces podemos usar cualquier operación (usar controlador, vistas) usando estas clases DTO. Y cuando necesitamos una vista compleja, me refiero a que cuando necesitamos datos de varias clases en una vista, podemos usar viewmodel. Para viewmodel podemos crear un nombre de carpeta viewmodel, luego crear una clase personalizada y mantener esa propiedad que necesitamos. Traté de aclararme. Cualquier sugerencia muy apreciada.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.