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):
- autómata lee la capa de servicio para recuperar un modelo de dominio (un agregado raíz en la mayoría de situaciones)
- controlador llama a la capa de asignación para asignar el modelo de dominio a un modelo de vista
- controlador pasa a la vista del modelo a la vista
PUT
(INSERT en términos RDBMS):
- controlador recibe un modelo de vista de la vista como argumento de la acción
- controlador asigna el modelo de vista de un modelo de dominio controlador
- pasa el modelo de dominio a la capa de servicio para el procesamiento
- controlador redirige a una acción GET
DELETE
(DELETE en términos RDBMS)
- controlador recibe un id como parámetro de acción
- controlador pasa el ID a la capa de servicio para el procesamiento (eliminar)
- controlador redirige a una acción GET
POST
(ACTUALIZACIÓN en términos RDBMS):
- controlador recibe un modelo de vista de la vista como argumento de la acción
- 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
- 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);
- controlador pasa el modelo de dominio actualizado a la capa de servicio para el procesamiento (update)
- 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
muchas gracias por nuestra respuesta detallada. realmente me ayudó a entender cómo debería funcionar. – qinking126
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? –
@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. –