【问题标题】:Model in MVC is it business logic or data displayed by the ViewMVC中的Model是业务逻辑还是View展示的数据
【发布时间】:2013-11-12 22:49:29
【问题描述】:

与其他许多人一样,我在理解 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 完全是表现层模式,与业务逻辑层无关,在这种情况下,模型只是视图显示的数据
  • 模型是服务层和域类,控制器通过服务方法调用触发模型更新,用于渲染视图的数据应该以某种方式表示模型状态,这就是为什么它在渲染函数中也称为模型

你怎么看?

【问题讨论】:

  • 对我来说,“模型”只是发送到“控制器”指示的“视图”的所有变量,服务只是为了不再重复您的代码并在控制器中再次重复

标签: grails model-view-controller


【解决方案1】:

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

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

因此,在这种情况下,您可能希望使用不同的“模型”,向 MVC 框架公开部分(但不是全部)属性。

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

【讨论】:

    【解决方案2】:

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

    很简单,在 Grails 世界中:

    M:模型是您的Domain 类,用于为您的数据层(表、集合等)建模

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-03
      • 2018-11-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      相关资源
      最近更新 更多