asp.net-mvc - Asp.Net MVC 操作 - 关注点分离/单一职责原则

标签 asp.net-mvc separation-of-concerns

在计算机科学中,我们被告知每种方法都应该做一件事并且只做一件事。我有点困惑,我们看到了如下所示的 MVC 操作 given as examples of good practice :

    [AcceptVerbs(HttpVerbs.Post), Authorize]
    public ActionResult Edit(int id, FormCollection collection) {

        Dinner dinner = dinnerRepository.GetDinner(id);

        if (!dinner.IsHostedBy(User.Identity.Name))
            return View("InvalidOwner");

        try {
            UpdateModel(dinner);

            dinnerRepository.Save();

            return RedirectToAction("Details", new { id=dinner.DinnerID });
        }
        catch {
            ModelState.AddModelErrors(dinner.GetRuleViolations());

            return View(new DinnerFormViewModel(dinner));
        }
    }

基本上这段代码提供了很多功能:
  • 定义如何访问操作 - 仅发布
  • 定义谁可以访问操作 - 授权
  • 访问持久化机制-dinnerRepository
  • 访问状态信息 - (User.Identity.Name)
  • 将 NameValueCollection 转换为强类型对象 - UpdateModel()
  • 为每个指定 3 个可能的 ActionResults 和内容 - InvalidOwner/Details/Edit views

  • 对我来说,这对于一种方法来说似乎有太多的责任。这也是一个相当简单的操作,即它不处理常见的场景,例如:
  • 检查业务规则 - “从不信任用户输入”
  • 导航路径 - 成功保存后始终返回“详细信息”
  • 不同的返回类型 - 有人想从网格中调用“编辑”并需要 JsonResult?
  • 更好的错误处理 - 如果在 GetDinner(id) 期间无法访问数据库,则为 YSOD
  • 构建附加 View 数据 - 下拉列表的 SelectLists

  • 更不用说围绕这种单一方法所需的测试量,即 FormCollection/UserIdentity/Authorization Provider/Repository/等的模拟/伪造。

    我的问题是我们如何避免在我们的 Controller 操作中塞满这么多东西?

    我倾向于认为 "opinions"是一个很棒的概念,尤其是“Thunderdome 原理”。虽然我非常尊重参与 build 的人 FubuMVC以及他们这样做的原因,我需要一些我现在可以使用的东西。

    编辑 - 好吧,看来我是在追求这样的 - Opinionated Controller .我需要进一步检查它,因为它适用于 MVC Preview 5,所以我可能需要自己更新它。

    最佳答案

    对我来说,这个方法只做一件事:用从网络表单接收到的编辑值更新模型。

    很明显,这样做需要发生一些事情,但它们是原子的且定义明确的。如果您需要修改模型的这部分需要如何更新,这是要查找和更新的 Controller 操作。

    您可能会争辩说,由于此处检查了业务规则,因此不符合 Thunderdome 原则之一“ Controller 应该轻巧”。但是 NerdDinner 是一个非常简单的应用程序,将它放在一个额外的层中是没有意义的。

    如果你发现这个方法做的太多,也许你应该找到一种语言,它禁止在一个方法中放置多个语句。

    关于asp.net-mvc - Asp.Net MVC 操作 - 关注点分离/单一职责原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/975680/

    相关文章:

    PHP 关注点分离和 MVC

    node.js - ElasticSearch 与 nodejs : why use the npm module?

    asp.net - 使 asp.net mvc 输出缓存的部分无效 - 具有不同的粒度级别

    asp.net-mvc - asp.net mvc : why is Html. CheckBox 生成额外的隐藏输入

    asp.net-mvc - 限制匿名访问 ASP.Net MVC 站点的问题

    asp.net-mvc - 'CreateMap' 语句应该去哪里?

    asp.net-mvc - 如何告诉 Ninject 绑定(bind)到它没有引用的实现

    c# - 为什么 UserManage.CreateAsync 在使用重复用户名时抛出 EntityValidationError 而不是返回失败结果?

    c# - 如何在 ASP.NET MVC 中路由 Web 表单页面?

    separation-of-concerns - 单一责任原则与关注点分离的区别