分离关注点的MVC最佳实践

时间:2018-06-19 07:09:13

标签: c# asp.net-mvc scaffolding

我正在使用MVC5制作网站。

我正在使用脚手架从我的模型类生成控制器。每当它创建控制器的脚手架时,db-connection和模型操作都在控制器类中发生(见下文)。通过查看thread,我可以看出大多数人都认为这应该发生在模型类中。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Username")] User user)
{
    if (ModelState.IsValid)
    {
        db.Entry(user).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
  return View(user);
}

我不应该让控制器这样做,而应该让它看起来像这样吗?:

用户 - 控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "Username")] User user)
{
    if (ModelState.IsValid)
    {
        UserModel userModel = new userModel();
        userModel.editUser(user);
        return RedirectToAction("Index");
    }
  return View(user);
}

用户-模型

public void editUser(User user){
    db.Entry(user).State = EntityState.Modified;
    db.SaveChanges();
}

指定" db"是,它将是我的数据库上下文的参考。

1 个答案:

答案 0 :(得分:2)

我认为您误解了所引用答案中“模型”的含义(In a MVC application, should the controller or the model handle data access?)。

tereško的回答说:

  

MVC和MVC启发模式中的业务逻辑必须位于模型层中。是的,模型应该是图层,而不是类或对象。

所以不要将数据库访问权限放入ViewModel。相反,您希望业务层中的服务类执行数据库访问,并将数据库实体映射到数据传输对象或ViewModel。请注意我如何使用Command和Query类将业务层的访问与ViewModel等任何前端类分开(使用AutoMapper在DTO&lt; - &gt; ViewModel&lt; - &gt; Command / Query)之间进行转换。< / p>

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(UserViewModel postData) {
     if (!ModelState.IsValid) {
         return View("Edit", postData);
     }

     var command = Mapper.Map<EditUserCommand>(postData);
     var updatedUserDto = _userService.EditUser(command);

     var updatedUserViewModel = Mapper.Map<UserViewModel>(updatedUserDto);
     return View("Show", updatedUserViewModel);
}

Controller使用此业务层:

{{1}}