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

And*_*rey 5 model-view-controller asp.net-mvc design-patterns

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

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

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

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

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

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

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

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

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

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

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

问题3:我应该在哪里画出这种极端之间的界线?如何平衡?

谢谢,安德烈

Tom*_*mmy 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
Run Code Online (Sandbox Code Playgroud)

控制器

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
Run Code Online (Sandbox Code Playgroud)

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

回答问题。

  1. 是的,我想你很明白
  2. 不,我不同意。ASP.NET MVC 的优点之一是它的实现非常灵活。如果你真的愿意的话,你可以把所有的逻辑都放在你的观点中(为什么,哦为什么有人想要这样做),但你有选择。
  3. 我认为要划清界限,请牢记 DRY 原则。如果您的逻辑重复多次,请确保它是模型的一部分或您可以从一个位置引用的某个自定义业务类。对我来说,这是设计 MVC 应用程序的主要驱动原则之一。