Modelos, ViewModels, DTO en la aplicación MVC 3

Tengo una solución web (en VS2010) con dos subproyectos:

Domain que contiene elModel clases (asignadas a tablas de base de datos a través de Entity Framework) yServices que (además de otras cosas) son responsables de las operaciones CRUD

WebUI que hace referencia al proyecto de Dominio

Para las primeras páginas que he creado, he usado las clases Modelo del proyecto Dominio directamente como Modelo en mis Vistas fuertemente tipadas porque las clases eran pequeñas y quería mostrar y modificartodo propiedades.

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 usando unaproyecció del resultado de la consulta en mi clase de servicio. Pero necesitoproject en un tipo - y aquí vienen mis preguntas sobre las soluciones que puedo pensar:

IntroduzcoViewModels que viven en laWebUI proyecto y exponerIQueryables y elEF data context del servicio al proyecto WebUI. Entonces podría proyectar directamente en esos ViewModels.

Si no quiero exponer IQueryables y el contexto de datos de EF pongo elViewModel clases en elDomain proyecto, entonces puedo devolver los ViewModels directamente como resultado de las consultas y proyecciones de las clases de Servicio.

Además deViewModels en elWebUI proyecto presentoData transfer objects que mueven los datos de las consultas en las clases de Servicio a laViewModels.

Solution 1 y 2 parecen la misma cantidad de trabajo y estoy inclinado a preferir la solución 2 para mantener todas las preocupaciones de la base de datos en un proyecto separado. Pero de alguna manera suena mal tenerVe -Modelos en el proyecto Dominio.

Solution 3 parece mucho más trabajo ya que tengo más clases para crear y preocuparme por el mapeo Model-DTO-ViewModel. Tampoco entiendo cuál sería la diferencia entre los DTO y los ViewModels. ¿No son los ViewModels exactamente la colección de las propiedades seleccionadas de mi clase de Modelo 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 tus comentarios por adelantado!

Edita (porque quizás tenía un muro de texto demasiado largo y me pidieron el código)

Ejemplo: tengo unaCustomer Entidad ...

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 muestre (y tal vez permita editar) laName de clientes en una lista. En una clase de Servicio extraigo 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();
        }
    }
}

Luego hay un CustomerController con un método de acción. ¿Cómo debería ser esto?

De esta manera (a) ...

public ActionResult Index()
{
    List<SomeClass1> list = _service.GetCustomerNameList();
    return View(list);
}

... o mejor así (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, diría:SomeClass1 (vive enDomain proyecto) es un DTO ySomeClass2 (vive enWebUI proyecto) es un ViewModel.

Me pregunto si alguna vez tiene sentido distinguir las dos clases. ¿Por qué no elegiría siempre la opción (a) para la acción del controlador (porque es más fácil)? ¿Hay razones para presentar la ViewModel (SomeClass2) además de DTO (SomeClass1)?

Respuestas a la pregunta(3)

Su respuesta a la pregunta