我刚刚开始使用 ASP.NET MVC,试图首先了解这一理念。我想我很清楚控制器和视图所扮演的角色,但我对模型部分有点困惑。一些消息来源说它是域模型,有人说它是数据模型,有人说它是绑定到视图的对象。
恕我直言,这些是非常不同的事情。那么请有人可以一劳永逸地解决这个问题吗?
我刚刚开始使用 ASP.NET MVC,试图首先了解这一理念。我想我很清楚控制器和视图所扮演的角色,但我对模型部分有点困惑。一些消息来源说它是域模型,有人说它是数据模型,有人说它是绑定到视图的对象。
恕我直言,这些是非常不同的事情。那么请有人可以一劳永逸地解决这个问题吗?
我实际上喜欢添加一个额外的层以使事情更清晰。基本上,“模型”是特定于域的东西,并且知道如何自我持久化(假设持久性是域的一部分)。
IMO,我提到的另一层我称为 ViewModel ...有时,传递给视图的“模型”实际上与域无关...它将包含验证信息、用户显示信息等内容,用于在视图中显示的查找列表值。
我认为这就是你所面临的脱节:-)
当他们说它是域模型时,您的建议来源是正确的。在许多情况下,它也将与您的数据模型非常紧密地对齐。
域模型和数据模型的不同之处在于数据模型在形式(而非内容)上是相对静态的,而您的域模型添加了域的特定约束和规则。例如,在我的数据模型(数据库)中,我将血压表示为 smallints(收缩压和舒张压)。在我的域模型中,我有一个“血压读数”对象,它保存两个读数中的每一个的值,并且还对可接受值的范围施加了额外的限制(例如,收缩压的范围远小于 smallints 的范围)。它还增加了对这些值的定性判断(150/90 的 BP 为“高”)。
问题域的这些方面的添加使得域模型不仅仅是数据模型。在某些领域(例如,那些可以更好地使用完全面向对象的数据模型呈现并且在关系模型上映射不佳的领域),您会发现两者有很大的不同。但是,我创建的所有系统都具有非常高的重叠度。事实上,我经常通过存储过程、用户定义类型等将相当数量的域约束推送到数据模型本身。
你应该看一下这个一步一步的教程。
来自其中一章:第 26 页
在模型-视图-控制器框架中,术语“模型”指的是代表应用程序数据的对象,以及与之集成验证和业务规则的相应领域逻辑。该模型在许多方面都是基于 MVC 的应用程序的“心脏”,我们稍后将看到它从根本上驱动它的行为。
希望它有用。
例如,如果您正在建立一个网站来管理核电站的运营,那么模型就是工厂的模型,包含当前运行参数(温度等)的属性,启动/停止方法发电等。嗯……在这种情况下,模型实际上是真实工厂与孤立模式的投影,但你明白了。