【问题标题】:MVC best practice for seperation of concerns [closed]关注点分离的 MVC 最佳实践 [关闭]
【发布时间】:2018-06-19 07:09:13
【问题描述】:

我正在使用 MVC5 制作网站。

我正在使用脚手架从我的模型类生成我的控制器。每当它创建控制器的脚手架时,数据库连接和模型操作都会发生在控制器类中(如下所示)。通过查看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”是什么,它将是对我的 db 上下文的引用。

【问题讨论】:

  • 如果有的话,应该是public static void Edit(User user)public void Save(DatabaseContext db)
  • 您找到了一篇帖子,其中一些用户发表了他们的意见,我还可以找到几十个帖子说这不是一个好主意
  • @StephenMuecke 线程中的几乎所有人都声称应该将其分开。你能给我举个例子,为什么这是个坏主意吗?
  • 太多人使用 MVC 作为整个应用程序的模式。我认为 MVC 更像是您的表示 (GUI) 层的细分。 MVC 中的模型通常是 ViewModel。
  • 您在征求与 SO 无关的意见。

标签: c# asp.net-mvc scaffolding


【解决方案1】:

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

tereško 的回答说:

MVC 和受 MVC 启发的模式中的业务逻辑必须在模型层中。是的,模型应该是一个,而不是一个类或对象。

所以不要将数据库访问权限放入您的 ViewModel。相反,您希望业务层中有一个服务类,它执行数据库访问并将数据库实体映射到数据传输对象或视图模型。请注意我如何使用 Command 和 Query 类将业务层的访问与任何前端类(如 ViewModels)分离(使用 AutoMapper 在 DTO ViewModel Command/Query 之间进行转换)。

public interface IUserService {

    public UserDto CreateUser(CreateUserCommand command);

    public UserDto EditUser(EditUserCommand command);

    public void DeleteUser(DeleteUserCommand command);

    public UserDto[] FindUsers(FindUsersQuery query);
}

控制器使用此业务层:

[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);
}

【讨论】:

  • “模型应该是一个层”,是的,在业务逻辑层 (BLL) 和数据访问层 (DAL) 以及其他一些层旁边。
  • 啊,所以我应该将 DbContext 类视为我的模型的一部分? :)
  • DbContext 绝对是 DAL 的一部分。它几乎是 DAL。
  • @bommelding, DbContext 是数据访问层的实现。通常业务层定义数据访问层(接口)的抽象,数据访问层将实现它们,其中 DbContext 将是实现细节。
  • 一个 DbCONtext 做持久化,而不是业务逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多