0

和其他许多人一样,我在理解 MVC 模式方面遇到了问题。更准确地说,让我们谈谈 Grail Web 应用程序。我的理解是模型是服务和域类。控制器的典型用法是(实际上对于这种特殊用法,我们可以直接从控制器调用 Person.get(id),但假设我们通过服务进行调用):

def getPerson(String id){
    Person person = peopleService.get(id);
    render(view: "person", model: person)
}

在这种情况下,服务方法返回了域对象,如果它是模型的一部分。但可能是服务方法不修改域对象或不修改它,而是返回布尔值。

def savePerson(Person p){
    boolean saved = peopleService.save(p);
    render(view: "actionresult", model: saved)
}

在这种情况下,布尔值不是模型的一部分,但是它在渲染方法中被命名为模型。

所以我有三个假设:

  • 有两种模型:负责业务逻辑的应用层模型和用于渲染视图的数据
  • MVC 完全是表现层模式,与业务逻辑层无关,在这种情况下,模型只是视图显示的数据
  • 模型是服务层和域类,控制器通过服务方法调用触发模型更新,用于渲染视图的数据应该以某种方式表示模型状态,这就是为什么它在渲染函数中也称为模型

你怎么看待这件事?

4

2 回答 2

1

我会说你的假​​设是正确的 - MVC 在不同的上下文中可能意味着不同的东西。当您基于 MVC 模式创建 MVC 框架或应用程序时,您还定义了“模型”在该上下文中应该是什么。例如,它可以是一个复杂的域模型,也可以只是一个数据访问层。

我认为可以肯定地说,在使用通用 MVC 框架构建的复杂 Web 应用程序的上下文中,“模型”不一定与业务逻辑的模型相同。网店中“产品”的基本业务模型可以包含有关供应商和采购价格的信息,例如,您可能永远不想在网店界面中公开这些信息。

因此,在这种情况下,您可能希望使用一个不同的“模型”,将它的一些(但不是全部)属性暴露给 MVC 框架。

有一个称为MVVM的概念明确地考虑了这一点。简单地说,“视图模型”是“正确”模型的映射,用于在特定视图中显示。

于 2013-11-12T23:15:50.747 回答
1

Grails 非常清楚地区分不同的层。

非常简单,在 Grails 世界中:

M:模型是对Domain数据层(表、集合等)进行建模的类

V:视图是您的gsp页面或表示层

C:控制器是路由器,将职责分配给其他类,但是,它们很容易被滥用于其他职责。

Services只是负责具有特殊特征(事务等)的业务逻辑的助手类。

于 2013-11-12T23:26:19.550 回答