在我的ASP.net mvc应用程序中,我使用服务层和存储库来保持控制器的简洁。一个典型的只读详细信息视图如下所示:
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);
}
}
由于 AutoMapper 可以轻松地将事物展平,因此从服务层转移到视图模型非常容易。然而,将视图模型直接传递到我的服务层是我难以找到好的解决方案的地方。
在像创建操作这样的情况下,有什么好的方法吗?
[HttpPost]
public ActionResult Create(CreateProjectViewModel model)
{
if(!ModelState.IsValid)
{
return View(model);
}
// TODO
return RedirectToAction("Index");
}
我相信服务层不应该知道任何关于视图模型的信息,但我也认为AutoMapper在这种情况下并不适用,因为它不能很好地将一个平面模型转换成一个复杂的对象。
我的控制器应该如何与服务层通信?我希望保持控制器中的代码尽可能简洁。