MVC - 控制器到服务层通信

Dis*_*ile 6 c# asp.net-mvc service-layer

在我的ASP.net mvc应用程序中,我使用服务层和存储库来保持我的控制器很薄.典型的详细信息只读视图如下所示:

public ActionResult Details(int id)
{
    var project = _projectService.GetById(id);

    return View(Mapper.Map<Project, ProjectDetails>(project));
}
Run Code Online (Sandbox Code Playgroud)

服务层:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

从服务层移动到视图模型非常容易,因为自动化器可以很容易地平整事物.从视图模型直接移动另一个传递到我的服务层是我努力想出一个好的解决方案的地方.

在像Create一样的情况下,有什么好办法呢?

[HttpPost]
public ActionResult Create(CreateProjectViewModel model)
{
    if(!ModelState.IsValid)
    {
        return View(model);
    }

    // TODO

    return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)

我很确定服务层不应该对视图模型有任何了解,但我也不认为AutoMapper在这种情况下运行良好,因为它不擅长采用扁平模型并将其变成复杂对象.

我的控制器应该如何与服务层通信?我想尽可能保持控制器中的代码.

Dar*_*rov 5

您可以定义双向映射,然后反过来:

[HttpPost]
public ActionResult Create(CreateProjectViewModel model)
{
    if(!ModelState.IsValid)
    {
        return View(model);
    }

    Project project = Mapper.Map<CreateProjectViewModel, Project>(model);
    // pass the project entity to your service layer
    _projectService.Create(project);

    return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)

或者,如果要更新实体,则可能首先要从服务中获取要更新的现有实体:

[HttpPost]
public ActionResult Update(CreateProjectViewModel model)
{
    if(!ModelState.IsValid)
    {
        return View(model);
    }

    Project project = _projectService.GetById(model.Id);
    Mapper.Map<CreateProjectViewModel, Project>(model, project);

    // pass the project entity to your service layer
    _projectService.Update(project);

    return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)