模型视图控制器(MVP):什么是模型?

8

我似乎无法理解MVP中的MODEL是什么。

如果我有一个分层架构PRESENTATION / APPLICATION / DOMAIN / INFRASTRUCTURE,那么MODEL到底是什么?

  1. 通过较低层访问DOMAIN对象?
  2. 在PRESENTATION层中定义的单独对象,映射到UI并使用从较低层获取的数据?

如果有人能够澄清我的MODEL理解,将不胜感激。

4个回答

8
模型通常是表示应用程序所操作的核心领域(业务或其他)的一组类/类型/组件。这些类执行所需的关键逻辑,通常以业务规则的形式出现,并消耗/操作数据。
在您的分层示例中,模型大多数情况下可以在领域层中找到,但也可能在应用程序层中。
我认为您难以理解它,因为您试图将两种不同的架构模式或应用程序的视角结合起来,即n层/n层与MVP。
在应用程序中同时使用某种模型/视图方法并应用分层是完全合理的(也很常见)。也许您应该先专注于其中一种,然后在熟悉两种模式后再叠加它们。

你是在说这两种架构模式是不同的,不应该合并使用吗? - David
1
模型与数据息息相关。它们所包含的逻辑都与数据及其完整性有关。它们不应该包含视图或控制器逻辑(如何显示模型内容或在响应用户输入时向视图呈现哪些模型)。 - user1228
@David,说实话,我误将MVP理解为更通用的MVC。据我所知,MVP完全关注于您的UI。我实际上发现在这些各种模式中重复使用Model很烦人。对于最广泛认可的Model定义,您应该查看Martin Fowler的《企业应用架构模式》。 - Ash
@Will,在MVP中似乎是正确的,但绝对不是在更广泛的Model View Controller意义上。但这正是为什么David会问这个问题的原因。现在每个人和他们的狗都提出了“模型”的定义。我通常遵循Martin Fowler的书(请参见先前的评论)。 - Ash

4
在任何Model-View-*架构中,Model描述了应用程序中的数据(如果需要,可以将其传递给View进行渲染)。
如果您的应用程序已经拥有领域对象,那么很可能您可以将它们用作Model。

贾斯汀,你的意思是如果它们符合需求,对吗? - David
“适合需求”是指它们是否表达了您在视图中需要呈现的数据。如果没有,问题可以很容易地通过使用视图模型来解决……这些模型专门用于表达要在视图中呈现的数据。 - Justin Niessner
谁将负责创建这些视图模型?视图模型和我所看到的屏幕DTO是否相同? - David
我认为视图模型应该是屏幕DTO的功能等效物。至于谁应该负责创建它们...这完全取决于你的团队结构。我会说,创建视图的人应该负责创建视图模型,因为他们将使用/消耗它。 - Justin Niessner
非常抱歉上次评论没有表达清楚。我所说的“负责”是指在什么情况下需要负责。是由演示者负责编写视图模型吗? - David
抱歉造成困惑...是的,构建视图模型的责任应该由Presenter承担。 - Justin Niessner

3
无论您遵循什么架构指南,M始终是相同的。模型是特定于您的领域的部分。它是真正代表您应用程序尝试执行的部分。模型应该代表您的业务领域。这适用于MVP、MVC、MVVM等模式。
如果您正在制作库存系统,则库存类很可能在您的模型中,产品可能在那里,订单也是如此。这些是组成您领域逻辑的事物。

2
模型是数据。这可能只是来自数据集的数据库中的数据,也可能是完整的领域模型,其中对象代表您的业务领域。 视图是用户界面,无论是Web页面、Windows应用程序还是移动设备应用程序。 Presenter是两者之间的粘合剂和整个装置的大脑。由视图发起的操作在Presenter中进行。通常,在WinForms应用程序中,例如,我的View中的Button.Click事件只是调用Presenter上的一个方法,然后采取必要的行动(它可能只是在View中返回一些东西)。
Presenter通过接口持有对View和Model的引用。View有对Presenter的引用(通常我会强制类型化,但它也可以是一个接口)。Model不知道Presenter或View的存在。

是演示者根据模型状态周围的某些逻辑来确定按钮是否启用/禁用。 - David
一般来说,是的。有时候我会在视图中完成所有事情,特别是当视图中有两个相互依赖的部分与Presenter或Model没有关联时。我认为最好的经验法则是,是否需要在任何 UI 中完成所需的操作(在这种情况下应该从Presenter中完成),还是它是特定于您正在使用的特定类型的UI的(例如,在WinForms中执行但不在WPF中执行的操作)。 - Ryan Lundy
@RyanLundy 所以,就我所知,Presenter 就像是 Nodejs/Django/Spring 或者其他服务器一样?而 Model 就像是数据库系统中的数据模型/架构?而 View 则是用户界面(UI)? - Sobhani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接