En mi aplicación mvc ASP.net estoy usando una capa de servicio y repositorios para mantener mis controladores delgados. A los detalles típicos de sólo lectura vista se ve así: CapaMVC - Comunicación de la controladora a la capa de servicio
public ActionResult Details(int id)
{
var project = _projectService.GetById(id);
return View(Mapper.Map<Project, ProjectDetails>(project));
}
Servicio:
public class ProjectService : IProjectService
{
public Project GetById(int id)
{
var project = _projectRepository.GetProject(id);
// do some stuff
return project;
}
}
public class ProjectRepository : IProjectRepository
{
public Project GetProject(int id)
{
return context.Projects.Find(id);
}
}
Pasar de la capa de servicio al modelo de vista es bastante fácil debido a AutoMapper, que puede aplanar las cosas con bastante facilidad. Moviendo el otro directamente, desde el modelo de vista para pasar a mi capa de servicio es donde lucho para encontrar una buena solución.
En una situación como una acción Crear, ¿cuál es un buen enfoque para esto?
[HttpPost]
public ActionResult Create(CreateProjectViewModel model)
{
if(!ModelState.IsValid)
{
return View(model);
}
// TODO
return RedirectToAction("Index");
}
estoy bastante seguro de que la capa de servicio no debe saber nada acerca de modelos de vista, pero tampoco creo que AutoMapper funciona bien en este escenario tampoco, ya que no es bueno en tomar un modelo plano y convirtiéndolo en un objeto complejo.
¿Cómo debería mi controlador comunicarse con la capa de servicio? Quiero mantener el código en el controlador lo más ligero posible.
Ya sabes, siempre he encontrado que AutoMapper es engorroso de esta manera, sería bueno si algo como Resharper pudiera implementar una forma de crear asignaciones en objetos complejos automáticamente. Podría hacer un buen complemento –
Acerca de unflattening con AutoMapper: echó un vistazo a http://stackoverflow.com/questions/3145062/using-automapper-to-unflatten-a-dto? – rsenna
@rsenna Voy a echar un vistazo a eso, gracias. – Dismissile