【问题标题】:Naming conventions - One rule for Controllers, no rules for Models and Views命名约定 - 控制器有一条规则,模型和视图没有规则
【发布时间】:2009-04-17 08:50:43
【问题描述】:
在 ASP.NET MVC 中,控制器存在于一个名为 Controllers 的文件夹中。他们的名字必须以 Controller 结尾,否则事情就无法正常工作(您会收到 HTTP 404 错误)。
但是,模型名称不必以 Model 结尾,视图名称不必以 View 结尾。
这似乎不一致...为什么(从 MVC 或设计的角度)控制器名称必须以 Controller 结尾?
其他 MVC 框架有这个要求吗?
编辑
由于这似乎是惯例,我不提倡违反它(请参阅Convention over Configuration!),但我想了解其背后的原因。
【问题讨论】:
标签:
asp.net-mvc
model-view-controller
naming-conventions
【解决方案1】:
控制器约定使路由可以轻松找到控制器而无需额外配置。添加所需的 Controller 结尾可以降低您通过 MVC 路由意外暴露对象的可能性。
视图也有一个内置约定。默认情况下,视图应该位于为您的控制器命名的文件夹中,并且与调用它们的操作名称相同,这就是使您的操作中的方法调用 View() 能够在不指定视图的情况下工作的原因。无论如何,我经常发现自己指定视图,但如果您正在寻找一种约定,这绝对是框架鼓励的约定。
从模型的角度来看,您是正确的,没有标准约定。这是因为 ASP.NET MVC 框架从不直接接触模型。它需要一个约定让控制器从路由中找到它们,并且它需要一个约定让视图从控制器中找到它们......但是模型只能从控制器中的逻辑访问,所以框架不需要知道它们.
话虽如此,我已经看到大多数人构建他们的模型,就像他们在 MVC 之前构建他们的实体或领域模型一样。如果您使用的是活动记录模式,则将模型命名为与它们映射到的表相对应,如果您更多地关注域,则将模型命名为与它们正在建模的域的部分相对应。此外,我看到越来越多的人创建了一组视图模型,这些视图模型仅用于向 UI 呈现数据,并且是通过从您的域中的各种模型中提取部分来创建的。模型绝对是 ASP.NET MVC 中最不自以为是的部分,但在 imo 中这是一件好事,因为人们在这个领域有非常不同的工作方式。
【解决方案2】:
这只是一个约定而不是要求!您可以通过自定义 DefaultControllerFactory 或创建自己的控制器工厂来更改此行为。
请参阅here 了解更多信息。 MvcContrib 项目中也有一些示例,它们从依赖注入引擎注入控制器。看看here。