我原本打算问一个较长的问题,但我觉得我问得越短,您就越能理解我的意思。

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

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

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

View ---> Controller ---> Model

[视图取决于控制器,控制器取决于模型]

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

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

关于格里格的帖子:

  • 就模拟而言,图层仍然允许您使用命令处理器模式来模拟按钮单击以及任何其他范围的事件。
  • UI 更改仍然非常容易,甚至可能更容易。在 MVC 中,控制器和视图倾向于结合在一起。层次创造了严格的分离。这两层都是黑匣子,在实现中可以自由地独立变化。
  • 控制器对视图的依赖性为 0。View可以写,并且通过松耦合仍然可以节省时间。
有帮助吗?

解决方案 5

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

最近,一位教授确实引导我走向了正确的方向。本质上,他告诉我的是:分隔模型、视图和控制器的层 MVC。在普通的 MVC 架构模式中,通常不使用视图与模型之间的依赖关系,并且实际上最终会得到层。想法是一样的,只是命名不好。

其他提示

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

还要考虑这样的场景:您需要开始一个项目,但艺术品需要数周或数月才能准备好。您是等待还是编写页面所需的所有代码,然后将视图连接到控制器。

至少我们就是这样做的,并且节省了几个月的时间。

它还使 UI 更改更容易处理,因为我们的 aspx 页面中没有任何代码执行任何操作。

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

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

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

模型定义数据。

视图定义了输出的样子。

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

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

是的?不?

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

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

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

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

看看一些 Struts2 的例子就明白我的意思了……

我想我理解你的观点:

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

正如我们所知,如果实际上不需要解耦,则执行此转换可能会付出更多的努力而不值得。如果视图使用模型对象,那么它就具有这种依赖性。但是,通过让视图仅依赖于控制器来获取所需的输入(可以是模型对象),可以稍微缓解这一问题。

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

在 Microsoft 平台上为新的或企业 Web 开发选择表示模式是一项艰巨的任务,在我看来只有三种;视图模型、模型-视图-呈现器 (MVP) 或 ASP.NET MVC(Model2 衍生品)。

您可以在这里阅读全文 ASP.NET MVC 模式

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

视图上:

if(model.something==true) {

%>

展示一些东西

<%

}

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

我可以说(尤其是在企业环境中)有两个“模型”

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

控制器编排视图,独立于视图,但有点依赖于模型:

进入控制器

公共行动结果索引(){

....

if(model.BoolProperty==true){

return ("第一个视图);

}

别的

{

返回(“第二个视图”);

}

}

我希望这是有道理的

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top