tengo una solución web (en VS2010) con dos subproyectos:Modelos, ViewModels, dtos en MVC 3 aplicación
Domain
que sostiene losModel
clases (asignada a las tablas de bases de datos a través de Entity Framework) yServices
la que (además de otras cosas) son responsables de las operaciones CRUDWebUI
que hace referencia al proyecto de dominio
Para las primeras páginas que he creado, he usado las clases de Modelo del proyecto de Dominio directamente como Modelo en mis Vistas fuertemente tipadas porque las clases eran pequeñas y quería mostrar y modificar todas las propiedades de.
Ahora tengo una página que solo debería funcionar con una pequeña parte de todas las propiedades del Modelo de dominio correspondiente. Recupero esas propiedades utilizando una proyección del resultado de la consulta en mi clase de servicio. Pero necesito proyecto en un tipo - y aquí vienen mis preguntas acerca de las soluciones que se me ocurre:
presento
ViewModels
cuales viven en el proyectoWebUI
y exponerIQueryables
y laEF data context
desde el servicio de el proyecto WebUI. Entonces podría proyectar directamente en esos ViewModels.Si no quiero exponer IQueryables y el contexto de datos EF puse los
ViewModel
clases en el proyectoDomain
, entonces puedo devolver los ViewModels directamente como resultado de las consultas y las proyecciones de las clases de servicio.Además de la
ViewModels
en el proyectoWebUI
introduzcoData transfer objects
que se mueven los datos de las consultas en las clases de servicio a laViewModels
.
la Solución 1 y 2 parecerse a la misma cantidad de trabajo y me siento inclinado a preferir la solución 2 a mantener todas las preocupaciones de base de datos en un proyecto separado. Pero de alguna manera suena mal tener Ver -Modelos en el proyecto de Dominio.
La solución 3 suena como mucho más trabajo ya que tengo más clases para crear y para preocuparme por el mapeo Model-DTO-ViewModel. Tampoco entiendo cuál sería la diferencia entre los DTO y los ViewModels. ¿No son ViewModels exactamente la colección de las propiedades seleccionadas de mi clase Model que quiero mostrar? ¿No contendrían los mismos miembros que los DTO? ¿Por qué querría diferenciar entre ViewModels y DTO?
¿Cuál de estas tres soluciones es preferible y cuáles son los beneficios y las desventajas? ¿Hay otras opciones?
¡Gracias por enviarnos tu opinión con anticipación!
Editar (porque tenía tal vez una demasiado larga pared de texto y han pedido para el código)
Ejemplo: Tengo una Entidad Customer
...
public class Customer
{
public int ID { get; set; }
public string Name { get; set; }
public City { get; set; }
// ... and many more properties
}
... y desea crear una vista que solo muestra (y quizás permite editar) el Name
de clientes en una lista. En una clase de servicio puedo extraer los datos que necesito para la vista a través de una proyección:
public class CustomerService
{
public List<SomeClass1> GetCustomerNameList()
{
using (var dbContext = new MyDbContext())
{
return dbContext.Customers
.Select(c => new SomeClass1
{
ID = c.ID,
Name = c.Name
})
.ToList();
}
}
}
entonces hay una CustomerController con un método de acción. ¿Cómo debería ser esto?
Cualquiera de esta manera (a) ...
public ActionResult Index()
{
List<SomeClass1> list = _service.GetCustomerNameList();
return View(list);
}
... o mejor de esta manera (b):
public ActionResult Index()
{
List<SomeClass1> list = _service.GetCustomerNameList();
List<SomeClass2> newList = CreateNewList(list);
return View(newList);
}
Con respecto a la opción 3 anterior yo diría: SomeClass1
(vive en el proyecto Domain
) es un DTO y SomeClass2
(vive en el proyecto WebUI
) es un ViewModel.
Me pregunto si alguna vez tiene sentido distinguir las dos clases. ¿Por qué no siempre elegiría la opción (a) para la acción del controlador (porque es más fácil)? ¿Hay motivos para presentar ViewModel (SomeClass2
) además del DTO (SomeClass1
)?
¿Se puede publicar el código? – jfar
@jfar: Ahora hay un ejemplo con código. – Slauma
Tengo curiosidad, ¿cómo ha funcionado tu enfoque elegido para ti? – kenwarner