14

我原本打算把这个问题写得更长,但我觉得我写得越短,你就越能理解我的意思。

  • MVC 架构模式有 3 个依赖项。视图取决于模型。控制器依赖于视图和模型。模型是独立的。

  • 层架构模式定义了 N - 1 个依赖项,其中 N 是层数。

给定三个层:模型、视图和控制器,只有 2 个依赖项,而传统 MVC 则为 3 个。结构如下所示:

View ---> Controller ---> Model

【View依赖Controller,Controller依赖Model】

在我看来,这种风格实现了相同的目标产生了更松散的耦合。为什么这种风格不常见?它真的实现了同样的目标吗?

编辑:不是 ASP.NET MVC,只是模式。

关于格里格斯的帖子:

  • 就模拟而言,Layers 仍然允许您使用命令处理器模式来模拟按钮单击以及任何其他范围的事件。
  • UI 更改仍然非常容易,甚至可能更容易。在 MVC 中,Controller 和 View 倾向于网格在一起。层创建了严格的分离。两个层都是黑盒子,在实现中可以自由地独立变化。
  • Controller 对 View 的依赖为 0。视图可以写,松耦合仍然可以节省时间。
4

8 回答 8

16

因为您将接口与控制器分离,从而使更改更容易。

还要考虑您需要开始一个项目但艺术品在数周或数月内无法准备好的情况。您是等待还是编写页面所需的所有代码,然后简单地将视图连接到控制器。

至少这是我们所做的,我们节省了几个月的时间。

它还使 UI 更改更容易处理,因为我们的 aspx 页面中没有任何代码可以做任何事情。

我们的测试也更好,因为我们可以模拟任何东西,包括按钮点击等。

如果您在谈论 asp.net-mvc 框架,则 aspx 文件中没有代码,也没有视图状态等。

于 2010-09-02T01:14:04.137 回答
3

在正确的 MVC 中,控制器不依赖于视图 afaik。或者也许我没有正确理解它。

模型定义数据。

视图定义了输出的样子。

控制器是从模型理解语法到视图理解语法的翻译器。

所以本质上控制器是独立的。视图是独立的。并且模型是独立的。

是的?不?

于 2010-09-02T01:14:46.780 回答
1

我会很大胆,并尝试解释为什么你的方法没有流行起来。

MVC 模式基本上要求视图层和模型层就 API 达成一致。由于一个服务另一个,并且代码中没有依赖关系,它使控制器保持一般行为,它需要做的就是在视图层中采用某种结构并在模型层上调用匹配的 API。

您会注意到,在视图和模型之间就 API 达成一致并不是什么大不了的事情,无论如何它都必须发生。你得到的是后端前端开发之间的良好分离。

在您提出的解决方案中,控制器方面需要进行大量开发。控制器将需要了解视图中的所有元素并将它们映射到模型层所需的特定调用。由于控制器是将许多视图连接到许多模型的单个访问点,这可能会很快失控并最终成为一个难以理解的控制器模块。

看一些 Struts2 的例子来明白我的意思......

于 2010-09-02T01:41:18.447 回答
1

我想我理解你的意思:

是的,您可以通过使控制器将模型对象(以 PHP 为例)转换为非模型对象(如简单数组)来使视图仅依赖于控制器。

正如我们已经知道的那样,如果实际上不需要解耦,则执行这种转换可能比它所付出的更多努力。如果 View 使用 Model 对象,那么它就有这种依赖关系。然而,这可以通过让 View 完全依赖于 Controller 来获得所需的输入(可以是 Model 对象)来稍微缓解一下。

Symfony PHP 框架促进了这种在模型和视图之间切换的瘦控制器风格。您仍然可以直接调用模型层来检索视图层中的对象,但强烈反对您提出的耦合问题。在视图中,您可以调用 include_component() 如果您需要查询模型,它实际上会返回到控制器。

于 2010-09-02T03:18:23.607 回答
1

我已经很久没有回过头来了,主要是因为我还在思考。我对收到的答案不满意,他们并没有真正回答我的问题。

最近,一位教授确实将我引向了正确的方向。本质上,他告诉我:将模型、视图和控制器分开的层MVC。在 vanilla MVC 架构模式中,通常不使用 View 与 Model 之间的依赖关系,并且您实际上以 Layers 结束。想法是一样的,只是命名很差。

于 2010-11-03T12:16:07.433 回答
0

在 Microsoft 平台上为新的或企业 Web 开发选择演示模式是一项艰巨的任务,在我看来只有三个;View Model、Model-View-Presenter (MVP) 或 ASP.NET MVC(Model2 衍生产品)。

你可以在这里阅读完整的文章ASP.NET MVC Patterns

于 2010-09-02T08:26:02.520 回答
0

我想补充一些东西。首先,就我的观点而言,我们使用模型作为容器来存储我们想要传递并在视图上显示的信息。通常,控制器中的操作方法以 return view("viewName",model) 结束。视图本身可能会根据模型更改其布局:

观点:

如果(model.something==true){

%>

要显示的东西

<%

}

此时很难找到模型的定义。

我可以说(尤其是在企业方面)这是两个“模型”

一个是域模型/实体模型,或者你想如何称呼它,它包含来自较低层(数据库等)的数据和包含我们想要显示的信息以及我们需要隐藏的任何其他信息的视图模型/显示部分界面

控制器编排视图并且与视图无关,但与模型有点无关:

进入控制器

公共行动结果索引(){

……

if(model.BoolProperty==true){

返回(“第一视图);

}

别的

{

返回(“第二视图”);

}

}

我希望这是有道理的

于 2010-11-03T12:06:47.107 回答
-2

在我看来,你最好在你的程序中尝试一下,你可以使用 ruby​​ on rails 或 codeigniter(for php),这些很棒的框架可能有助于你理解 MVC。

于 2010-09-02T01:35:53.117 回答