为什么MVC控制器必须在其类名上具有尾随的“Controller”约定?

时间:2012-07-19 08:53:21

标签: asp.net-mvc

我发现MVC不识别控制器,除非它有'控制器'附加到类名。 This answer提到ControllerDescriptorControllerTypeCache作为MVC中设置此约定的两个位置。

我的问题是为什么?它显然不是一个约定优于配置的东西,因为IsControllerType中的ControllerTypeCache会检查该类:

  • 公开
  • 不抽象
  • 实施IController
  • "Controller"
  • 结束

有人知道这个的原因吗?在所有控制器可能都在一个实际的MVC项目之后,在一个名为“控制器”的文件夹中,只需双击该文件就会向我们显示该类继承Controller

对我来说似乎很傻 - 但我想知道他们是否有实际原因。

修改

昨天Phil Haack刚刚看到this blog post,他在讨论这个会议的决定时 - 他对我有同样的想法 - 可能有点无意义!

3 个答案:

答案 0 :(得分:15)

自定义控制器工厂

您始终可以提供自定义控制器工厂,以不同方式解析这些类。我同意控制器不需要附加 Controller 类型名称,因为毕竟它们就像任何其他类一样。他们的OOP祖先类型无论如何都将它们定义为控制器(IControllerController ...)

Visual Studio可能吗?

虽然它可能与Visual Studio有关。与 Attribute 类相似。也许Visual Studio不会为不以 Controller 结尾的类提供额外的上下文菜单项。在控制器操作中,您可以轻松导航(或创建)到匹配的视图。

约定很好

所以say the experts我同意。在.net框架中还有其他类似的惯例,但人们不会抱怨它们。

考虑集合词典属性列表以及其他类型后缀的类型原因。他们以任何一种方式工作,但他们的用户 - 开发人员更容易识别他们,他们本能地知道他们应该如何工作以及何时使用它们。

根据Asp.net MVC团队的类型冲突

想象一下,ProductController可能会处理Product应用程序模型实体实例。由于没有 controller 命名约定,我们有两个具有相同名称的类型,因此总是必须提供名称空间来区分这两者。但是因为我们确实有这个约定,所以没有必要,也不会发生类型冲突。

public class ProductController : Controller
{
    public ActionResult Index()
    {
        // we'd have to distinguish this Product type here
        IEnumerable<Product> result = GetProducts();
        return View(result);
    }
    ...
}

答案 1 :(得分:0)

需要前2个以便mvc可以实例化控制器,需要第3个以便mvc知道如何使用控制器(调用Execute方法),而第4个我想只是更快地找到类型。

答案 2 :(得分:0)

是的会议很好,但我不认为这是一个惯例问题。这是从解决方案域中为正在使用的模式选择一个好名称的问题。

例如,如果处理产品的UX涉及列表,那么您可以简单地调用控制器ProductList,而不必将其与List混淆。作为人类,我们每天都可以根据情境轻松消除歧义,软件中的命名也不例外。现在控制器的作用是协调。在我们的ProductList的情况下。它将协调ProductList.sort(byField),ProductList.delete(product)等操作。

就利用约定优于配置的概念,可以在元级别上实现。在.Net中,可以使用属性来标识控制器或模型。

什么是重要的?在名称中声明模式会引发惰性命名,从而导致延迟建模。名称不仅仅是一个名称,它还会选择一个概念,您可以使用该概念对解决方案域进行建模,该解决方案域的意义决定了代码表示该概念的代码以及代码所耦合的其他代码。您的名称越通用和/或含糊不清就越多地邀请您的设计以难以维护的方式进行扩展和更改。