2012-07-16 16 views
6

mi proyecto mvc3 tiene las siguientes capas.automapper, ¿dónde pones tu código para mapear View Model to Entity

controller -> service -> repository.

necesito para mapear modelo de vista de la entidad, no está seguro de qué capa es el más adecuado para poner el código en.

Sé que cualquiera de los controladores o servicio, por favor hágamelo saber cuál debo utilizar, y si podrías por favor decirme por qué.

gracias.

Respuesta

10

necesito para mapear modelo de vista de la entidad, no está seguro de qué capa es el más adecuado para poner el código en.

Controlador por supuesto. Las capas de servicio y repositorio no saben lo que significa un modelo de vista . Manipulan solo modelos de dominio.

Por lo tanto, dentro del controlador utiliza la llamada .Map<TSource, TDest> para hacer la asignación entre un modelo de dominio y un modelo de vista. Pero la definición del mapeo en sí (llamada .CreateMap<TSource, TDest>) se realiza una vez por curso de validez de AppDomain, idealmente en un Profile.

Así que vamos a considerar un par de flujos de trabajo típicos dentro de un controlador de la acción en términos REST

GET (SELECT en RDBMS términos):

  1. autómata lee la capa de servicio para recuperar un modelo de dominio (un agregado raíz en la mayoría de situaciones)
  2. controlador llama a la capa de asignación para asignar el modelo de dominio a un modelo de vista
  3. controlador pasa a la vista del modelo a la vista

PUT (INSERT en términos RDBMS):

  1. controlador recibe un modelo de vista de la vista como argumento de la acción
  2. controlador asigna el modelo de vista de un modelo de dominio controlador
  3. pasa el modelo de dominio a la capa de servicio para el procesamiento
  4. controlador redirige a una acción GET

DELETE (DELETE en términos RDBMS)

  1. controlador recibe un id como parámetro de acción
  2. controlador pasa el ID a la capa de servicio para el procesamiento (eliminar)
  3. controlador redirige a una acción GET

POST (ACTUALIZACIÓN en términos RDBMS):

  1. controlador recibe un modelo de vista de la vista como argumento de la acción
  2. controlador consulta la capa de servicio para obtener un modelo de dominio que queremos actualizar usando la ID única contenida en el modelo de vista
  3. actualizaciones controlador sólo las propiedades del modelo de dominio que se recuperó y que también están presentes en el modelo de vista. Por ejemplo, el modelo de dominio puede consistir en un nombre de usuario y propiedades IsAdmin y el modelo de vista consistirá, obviamente, solo en una propiedad de nombre de usuario. Así que dejamos intacta la propiedad IsAdmin en el modelo de dominio y actualizamos la propiedad Nombre de usuario. En términos AutoMapper esto se traduce en la siguiente sobrecarga vacío de la .Map<TSource, TDest> método: Mapper.Map<ADomain, ViewModel>(domainInstanceControllerRetrievedUsingTheId, viewModelInstancePassedAsArgument);
  4. controlador pasa el modelo de dominio actualizado a la capa de servicio para el procesamiento (update)
  5. controlador redirige a una acción GET

Armado con esos 4 flujos de trabajo, está listo para el mundo CRUD.

P.S. Un recordatorio REST:

Create = PUT 
Retrieve = GET 
Update = POST 
Delete = DELETE 
+0

muchas gracias por nuestra respuesta detallada. realmente me ayudó a entender cómo debería funcionar. – qinking126

+1

Si asigna sus modelos de vista a sus entidades dentro del controlador (capa de aplicación MVC), entonces tiene que hacer referencia a sus entidades (su capa de datos) en la capa MVC, lo cual es malo de acuerdo con muchas respuestas aquí en SO. A menudo se dice que no debe mostrar sus entidades fuera de su capa de datos. Opiniones? –

+1

@MohammadSepahvand, no está mal hacer referencia a sus entidades ni a la capa de datos dentro de la capa MVC. Para eso está diseñada una capa de datos: para reutilizar en diferentes tipos de aplicaciones. Lo malo es pasar esas entidades a las vistas. –

Cuestiones relacionadas