В моем приложении mvc ASP.net я использую уровень обслуживания и репозитории, чтобы мои контроллеры оставались тонкими. Типичное представление подробностей только для чтения выглядит следующим образом:
public ActionResult Details(int id)
{
var project = _projectService.GetById(id);
return View(Mapper.Map<Project, ProjectDetails>(project));
}
Уровень обслуживания:
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);
}
}
Переход от уровня обслуживания к модели представления довольно прост из-за автомапера, который может довольно легко сгладить вещи. Перемещение другого прямого, от модели представления к моему уровню обслуживания, - вот где я изо всех сил пытаюсь найти хорошее решение.
В такой ситуации, как действие Create, что для этого лучше всего?
[HttpPost]
public ActionResult Create(CreateProjectViewModel model)
{
if(!ModelState.IsValid)
{
return View(model);
}
// TODO
return RedirectToAction("Index");
}
Я почти уверен, что уровень сервиса не должен ничего знать о моделях представления, но я также не думаю, что AutoMapper работает хорошо и в этом сценарии, поскольку из плоской модели нельзя превратить ее в сложный объект.
Как должен выглядеть мой контроллер для связи со слоем служб? Я хочу, чтобы код в контроллере был как можно более легким.