Según el enfoque tradicional o la teoría correcta, ViewModel debe ser parte de la capa de interfaz de usuario. Al menos el nombre lo dice.
Pero cuando empiezas a implementarlo tú mismo con Entity Framework, MVC, Repository, etc., entonces te das cuenta de algo más.
Alguien tiene que mapear Modelos de entidad con ViewModels (DTO mencionado al final). ¿Debería hacerse esto en A) la capa UI (por el Controlador), o en B) la capa Servicio?
Voy con la Opción B. La opción A es un no-no debido al simple hecho de que varios modelos de entidades se combinan para formar un ViewModel.Es posible que no pasemos datos innecesarios a la capa UI, mientras que en la opción B, el servicio puede jugar con datos y pasar solo el nivel requerido/mínimo a la capa UI después del mapeo (al ViewModel).
Pero, supongamos que vamos con la Opción A, ponemos ViewModel en la capa de UI (y el modelo de entidad en la capa de Servicio).
Si la capa de servicio necesita correlacionarse con el modelo de vista, entonces la capa de servicio necesita acceder a ViewModel en la capa de interfaz de usuario. ¿Qué biblioteca/proyecto? El modelo de vista debe estar en un proyecto separado en la capa de la interfaz de usuario, y este proyecto debe ser referenciado por la capa de servicio. Si ViewModel no está en un proyecto separado, entonces hay una referencia circular, así que no vayas. Parece incómodo tener la capa de servicio accediendo a la capa de interfaz de usuario, pero aún así podemos hacer frente a ella.
Pero, ¿qué ocurre si hay otra aplicación UI que utiliza este servicio? ¿Qué pasa si hay una aplicación móvil? ¿Qué tan diferente puede ser ViewModel? ¿Debe el Servicio acceder al mismo proyecto de modelo de vista? o ¿competirán todos los proyectos de UI?
Después de estas consideraciones, mi respuesta sería poner el proyecto Viewmodel en la Capa de servicio. ¡Cada capa de interfaz de usuario tiene que acceder a la capa de servicio de todos modos! Y podría haber muchos ViewModels similares que todos podrían usar (por lo tanto, la asignación se vuelve más fácil para la capa de servicio). Las asignaciones se realizan a través de linq en estos días, lo cual es otra ventaja.
Por último, hay esta discusión sobre DTO. Y también sobre la anotación de datos en ViewModels. ViewModels con anotaciones de datos no puede residir en la capa de servicio. Entonces DTO será una copia exacta de ViewModel con un mapeo uno a uno entre los dos (digamos con AutoMapper). Una vez más, DTO sigue teniendo la lógica necesaria para la interfaz de usuario (o múltiples aplicaciones) y reside en la capa de servicio. Y la capa de interfaz de usuario ViewModel es solo para copiar los datos de DTO, con un cierto 'comportamiento' (por ejemplo, atributo) añadido.
Aunque no está directamente relacionado con la pregunta. 'ViewModel Façade' (viewmodel dentro de otro viewmodel) & 'command' mencionado en esto debe mirar channel 9 link también vale la pena explorarlo (@ 11: 48 comienza)
Eso es más o menos lo que estoy haciendo ahora, pero debo estar haciendo algo mal, ya que parece que tengo mucha lógica condicional cuando me ocupo del modelo de vista de vuelta al dominio. Tal vez necesito dividir mi vista en trozos más pequeños. –
Actualmente tengo una vista de edición que adapta en función del estado de la entidad. ¿Sería mejor crear vistas múltiples para los diferentes estados? –
Sin ver su vista de edición y sus modelos, es difícil de responder. – queen3