2011-05-31 19 views
22

Estoy aprendiendo ASP.NET MVC y descargué un par de aplicaciones de muestra. MusicStore, etc ...Confundido con Model vs ViewModel

Vengo de un fondo wpf donde teníamos el Patrón MVVM. Me di cuenta de que usaban el concepto de modelo y ViewModel.

En MVVM es bastante claro que vincula la vista al ViewModel que inyecta el modelo en viewModel. En MVC tiene un controlador, pero no estoy seguro y confuso cómo los une a todos, ya que no puedo ver el modelo se inyecta en el modelo de vista

que tienen la siguiente estructura

  1. MyCompany.Entities.dll (Todos los modelos en este espacio) EG Producto
  2. MyCompany.Dal.dll (Todos los repositorios en este espacio)
  3. MyCompany.Services.dll (llamado por MyCompany.WebUI.Controller llama MyCompany.Dal)
  4. MyCompany. WebUI.MyApp
  5. MyCompany.Tests

De algunos de los ejemplos que he visto sus actos como un modelo ViewModel.Am en lo correcto?

Tomemos un controlador que tengo algo así como

public class ProductController 
{ 
    public ProductController(IProductRepository productRepository) 
    { 
     //omitted as not relevant 
    } 
} 
public class ProductVM 
{ 
    public ProductVM() 
    { 
     // Shouldn't we inject the model here RG Product 
    } 
} 

¿Hay algunos ejemplos de N-Capas por ahí que pueda referirse a? ¿El concepto de ViewModel es válido en MVC? ¿Cuál es el estándar?

Gracias por cualquier sugerencia.

Respuesta

32

Use ViewModels a simplifique the View.

Por ejemplo, puede tener un gráfico de objetos profundo con productos, pedidos, clientes, etc., y se requiere cierta información de cada uno de estos objetos en una vista particular.

Un ViewModel proporciona una manera de agregar la información requerida para una Vista en un solo objeto.

ViewModel también permite cosas como anotaciones de datos y validación, que no pertenecen a su modelo, ya que su modelo debe permanecer "específico del dominio".

Pero en realidad, ViewModels no es más que un simple contenedor para sus objetos de dominio.

Utilice una herramienta como AutoMapper para alternar entre sus modelos de vista y modelos de dominio con facilidad.

Personalmente i siempre se unen a ViewModel en mi vista, nunca a los modelos de dominio, incluso si es un solo objeto. ¿Por qué? Bueno, me gusta decorar mis ViewModels con UIHints, validación, anotaciones de datos. Del mismo modo que los modelos de dominio están enriquecidos con reglas específicas de dominio y lógica de negocios, sus modelos de vista deben enriquecerse con la lógica específica de la interfaz de usuario.

Si simplemente tiene un objeto con una representación de 1-1 de su modelo de dominio, le está faltando el punto de ViewModels.

Agregue al ViewModels solamente, y nada más, lo que se requiere para una vista en particular.

acción Ejemplo controlador

public ActionResult CustomerInfo(int customerId) 
{ 
    // Fetch the customer from the Repository. 
    var customer = _repository.FindById(customerId); 

    // Map domain to ViewModel. 
    var model = Mapper.Map<Customer,CustomerViewModel>(customer); 

    // Return strongly-typed view. 
    return View(model); 
} 
+2

Hola, gracias por su respuesta, ¿está diciendo: no tenemos modelos dentro de nuestra aplicación web. Tenemos ViewModels a los que se refieren los controladores y luego inyectamos el "Modelo" de dominio en el modelo de vista, para que podamos agregar anotaciones y validación para nuestros modelos de vista. ¿Tiene un ejemplo rápido en alguna parte o un enlace nuestro está estructurado? Le estaría muy agradecido. Gracias – user9969

+1

Eso es ** exactamente ** lo que estoy diciendo, bien hecho resumiéndolo en una sola oración. Ahora, por supuesto, su aplicación web aún deberá ** hacer referencia ** al ensamblaje del modelo de dominio, ya que necesita mapear entre ellos. Pero el truco es que sus puntos de vista no tienen idea de sus modelos de dominio, se unen a ViewModels. Ejemplo decente aquí: http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx. Solo busca en Google "asp.net mvc view model pattern" – RPM1984

+0

También agregué un ejemplo muy simple con AutoMapper. – RPM1984

1

La diferencia entre MVC y MVVM es que MVC tiene un conjunto de clases para las entidades de datos. En MVVM tiene 2: un conjunto para vincular sus vistas y otro para administrar la persistencia de los datos (que podría estar en un servicio separado de WCF, por ejemplo).

Las ventajas de MVVM son que el modelo vinculado a las vistas es relevante para la interfaz de usuario y completamente independiente del modelo de persistencia.

¿Qué usar? Bueno, depende de qué tan cerca la estructura de datos requerida por sus Vistas se mapee a la estructura de la base de datos. Cuando es similar, es posible enlazar los DataEntities de su DAL directamente a su vista, este es el patrón clásico de MVC. Sin embargo, gana mucho con un ViewModel por separado, ya que puede ampliar estas clases con el comportamiento específico de View (por ejemplo, Validation) que su DAL no debería preocuparse.

Para todas las aplicaciones menos las más simples, recomendaría el uso de un ViewModel por separado.

+0

Hola, gracias por su respuesta. Mis vistas no tendrán idea de la base de datos. Llamarán a "ViewModels" y a esos a Capa de servicio y de allí a DAL.Todos a través de interfaces.Desde lo que usted dice que el MVVM es realmente el patrón para usar en MVC. ¿Es esto lo que dice? – user9969

+0

Lo siento, mi frase final es confusa, no quise decir que las Vistas hicieran referencia a la base de datos, voy a actualizar. Quise decir qué tan estrechamente la estructura requerida en ViewModel coincide con la utilizada en la base de datos. Pero en respuesta a su pregunta, sí, en su caso un ViewModel sería mi elección. – BonyT

Cuestiones relacionadas