9

En mi aplicación ASP.NET MVC, tengo una página de edición bastante compleja que combina una cantidad de modelos en una vista.ASP.NET MVC - ¿Debo usar el patrón de repositorio para escribir modelos de vista en la base de datos o convertirlos a modelos primero?

Estoy usando el patrón ViewModel para combinar toda esta información y presentar un objeto cohesivo a la Vista.

Como un ejemplo, la estructura de mi ViewModel es algo como esto:

CompanyId 
CompanyName 
List<Employee> Employees 
List<ContactMethod> ContactMethods 

El objeto empleado tiene un número de propiedades básicas, y un método de contacto preferido.

En la página de edición, el usuario recibe todos los empleados de la empresa y tienen la capacidad de agregar y eliminar (mediante javascript), así como editar los detalles de los empleados. La lista ContactMethods se usa para completar el menú desplegable de cada empleado.

He traducido satisfactoriamente mis Modelos (leídos de la base de datos) en este ViewModel y viceversa, así que después de una edición, me queda un ViewModel que representa el estado actual de los empleados de esa compañía.

Estoy usando un patrón Repositorio para comunicarme con la base de datos, por lo que mi pregunta es ¿debo llamar directamente al CompanyRepository, pasar el ViewModel, o debo convertir el ViewModel de nuevo en objetos Model primero antes de usar el Repositorio para escribirlos en la base de datos?

En resumen, ¿debería saber el repositorio acerca de mis objetos ViewModel?

Respuesta

13

Convertiría de nuevo el ViewModel en objetos de modelo. Me gusta mantener la dependencia entre mi capa web y las capas de repositorio lo más suelta posible.

No creo que su Repositorio deba saber sobre su ViewModel, ya que es un concepto de nivel web.

+0

Si ese es el caso (y esto está bien), necesitaría crear estos Modelos de Empleados, eliminar todos los Empleados existentes de esa Compañía, luego agregar los nuevos Modelos de Empleados ... o ... Recuperar todos los modelos de Empleados de la base de datos y los relaciona antes de agregar, eliminar y editar, según corresponda. Suena bien? – Damovisa

+0

@Damovisa: podrías hacer eso. En cambio, mantendría esa información durante la edición. En su ViewModel mantenga tres listas: EmployeeEmployees, EditedEmployees, DeletedEmployees. – manu08

+0

@ manu80 - Veo cómo podría funcionar, pero podría ser un poco complicado. La interfaz de usuario tendría que cambiar un poco para dar cuenta de estas tres colecciones, incluso si solo es el cambio de JavaScript. – Damovisa

4

ViewModel es el modelo de la vista (IU), por lo que el repositorio no debe conocer el modelo de vista. Separarlos mantendrá el repositorio acoplado libremente desde la interfaz de usuario.

Utilice otra capa como capa de servicio para encapsular el repositorio desde la interfaz de usuario. Esta capa también hace ViewModel - Conversación de modelo y hacer llamada de repositorio.

public class ServiceLayer 
{ 
    public void SaveModel(ViewModel viewmodel) 
    { 
     var model = viewModel.ToModel(); 
     repository.Save(model) 
    } 
} 
+0

¿Por qué hacer que ServiceLayer dependa del ViewModel? En su lugar, llame a viewModel.ToModel en la capa de vista y luego pase el modelo al servicio. – manu08

+0

@Hery - Sí, suena bien, pero habría mucho más que solo pasarle un modelo al Repositorio. Los modelos de empleado pueden ser nuevos, cambiados o eliminados. – Damovisa

+0

@manu: es solo una forma diferente de implementar, dependa de cómo quiera encapsular su repositorio desde la vista. Pero puedo enumerar algunos de los beneficios como: - Realice algunas validaciones comerciales que no están cubiertas por la conversión de ToModel. - Mantenga el modelo de repositorio simple y genérico, mientras que la capa de servicio hace tareas más específicas que están relacionadas con el modelo de vista solo mis 2 centavos :) – heisthedon

1

estoy de acuerdo con la respuesta anterior de convertir de nuevo en ViewModels Modelos "simple", pero añadiría que esta tarea probablemente debería ser llevada a cabo por una capa de servicio independiente. Esta capa sería responsable de desmontar sus ViewModels y actuar de manera apropiada.

Esto es esencialmente la definición de un servicio: algo cuyo trabajo es llevar a cabo una unidad lógica de trabajo que requiere múltiples modelos y/o lógica compleja.

+0

Creo que esta adaptación debe ser separada de los Controladores, pero no creo cabe en una capa totalmente separada tampoco. Es un concepto de capa de Vista solamente, y debería caer en las capas inferiores. Solo puede crear Adaptadores o algún tipo de clase auxiliar en la misma capa que los Controladores/Vistas. Guardaría esa capa de servicio (que está entre el repositorio y la capa de visualización) para validar los modelos. – manu08

Cuestiones relacionadas