ASP.NET MVC真的是MVC吗?或者如何将模型与控制器分开?

时间:2010-06-18 14:40:05

标签: asp.net-mvc model-view-controller design-patterns

这个问题有点夸夸其谈。在某些时候,我感觉ASP.NET MVC不是MVC模式的真实实现。或者我不明白。

考虑以下域:电动灯泡开关运动检测器。它们连接在一起,当您进入房间时,运动探测器开启灯泡。如果我想将它们表示为MVC:

  • switch是model,因为它保存状态并包含逻辑
  • 灯泡是视图,因为它向人类呈现模型的状态
  • 运动检测器是控制器,因为它将用户操作转换为通用模型命令

Switch有一个私有字段(On / Off)作为State和两个方法(PressOn,PressOff)。如果您在PressOn关闭时调用PressOn,它将变为On,如果再次调用它,则状态不会改变。

灯泡可以用蜂鸣器,带定时器或按钮的运动探测器替换,但模型仍然代表相同的逻辑。最终系统会有相同的行为。

这就是我理解经典MVC分解的方法,如果我错了,请纠正我。

现在让我们以ASP.Net MVC方式分解它。

  • 灯泡仍然是一种观点
  • 控制器将是开关+运动检测器
  • 模型是一个只会将状态传递给灯泡的对象。

因此定义行为的逻辑移动到控制器。

问题1:我对MVC和ASP.NET MVC的理解是否正确?
问题2:如果是,您是否同意ASP.NET MVC不是100%准确的实现?

恢复生机。最后一个问题是如何在ASP.NET MVC的情况下将模型与控制器分开。可能有两个极端。控制器做基本的东西,并调用模型来做所有的逻辑。另一个是控制器,所有的逻辑和模型都是类似于具有映射到DB的属性的类。

问题3:我应该在这两个极端之间划清界线?如何平衡?

谢谢, 安德烈

3 个答案:

答案 0 :(得分:2)

我认为这可能是两种方式。这将是一个实现是ASP.NET MVC,它保留了你在第一个例子中的逻辑。

模型(存储库)

Function switchOn() as bulb
    if !bulb.lightOn then
        bulb.lightOn = true
    end if
        return bulb
End Function

Function switchOff() as bulb
    if bulb.lightOn then
        bulb.lightOn = false
    end if
        return bulb
End Function

Function Motion(senseMotion as boolean) as bulb
    if(senseMotion and !bulb.lightOn) then
         bulb.lightOn = true
    end if
    return bulb
End Function

<强>控制器

Function PressSwitchOn() as actionresult
     return view("Bulb", lightRepository.switchOn)
End Function

Function PressSwitchOff() as actionresult
     return view("Bulb", lightRepository.switchOff)
End Function

Function SomethingMoved(byval hasMoved as boolean) as actionresult
     return view("Bulb", lightRepository.Motion(hasMoved))
End Function

我的控制器中没有业务逻辑,只是将状态从模型传递到视图。我是你的榜样吗?

回答问题。

  1. 是的,我认为你理解得很好
  2. 不,我不同意。 ASP.NET MVC的一个好处是它在您的实现中非常灵活。如果你真的想要(你为什么会有人想这样做,你可以把你所有的逻辑放在你的视图中),但你可以选择。
  3. 我想绘制线条,记住DRY原则。如果您多次重复逻辑,请确保它可以从一个地方引用模型的一部分或某个自定义业务类。对我而言,这是设计MVC应用程序的主要驱动原则之一。

答案 1 :(得分:1)

在您的示例中,运动检测器仍然必须调用SwitchOn和SwitchOff,这与在存储库上调用相同方法的控制器基本相同。因此,如果您考虑实现存储库模式的ASP.NET MVC应用程序,那么您的论点就会失败。

结论:

  1. 是的,原则上你是对的,但是你对MVC框架的使用方式非常有限。
  2. 不,我不同意你的意见。
  3. 重要吗? MVC是一种旨在使开发更容易 - 而不是更难的模式。以一种感觉相关的方式编写你的应用程序,如果你认为你违反了规则,那么称之为“MVC inpsired”(但是他们会关心......?)。

答案 2 :(得分:0)

在MVC框架中 - 请求总是FIRST来到Controller;然后只使用视图

创建和渲染模型

在您的情况下请求转到Switch(这是您所说的模型),因此您无法以所述方式分解开关灯泡运动场景。