gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 真的是 MVC 吗?或者如何将模型与 Controller 分离?

转载 作者:行者123 更新时间:2023-12-02 10:56:54 24 4
gpt4 key购买 nike

这个问题有点反问。在某些时候,我有一种感觉,ASP.NET MVC 并不是 MVC 模式的真正实现。或者说我没看懂。

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

  • switch 是模型,因为它保存状态并包含逻辑
  • 灯泡是 View ,因为它向人类展示了模型的状态
  • 运动检测器是 Controller ,因为它将用户操作转换为通用模型命令

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

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

这就是我对经典MVC分解的理解,如有错误请指正。

现在让我们用ASP.Net MVC的方式来分解它。

  • 灯泡仍然是一个 View
  • Controller 将由开关+运动检测器组成
  • 模型是一些只会将状态传递给灯泡的对象。

因此,定义行为的逻辑移至 Controller 。

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

然后又复活了。最后一个问题是在 ASP.NET MVC 中如何将模型与 Controller 分离。可能有两个极端。 Controller 执行基本操作并调用模型来执行所有逻辑。另一个是 Controller 执行所有逻辑,而模型只是类似于具有映射到数据库的属性的类。

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

谢谢,安德烈

最佳答案

我认为这两种情况都可以。下面是 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

Controller

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

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

回答问题。

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

关于asp.net-mvc - ASP.NET MVC 真的是 MVC 吗?或者如何将模型与 Controller 分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3070544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com