模型类与MVC中的模型有何区别?

3
MVC模型中,模型(Model)是否包含业务逻辑(算法等)和映射到实体表的类?那些被映射的类也被称为模型,因为它们对一些数据进行建模。我的困惑是:模型是否包含业务逻辑?还是只有实体?根据Mozilla文档,它包含了:Model: 管理数据和业务逻辑。 我对Java Spring项目的结构感到困惑。有控制器,服务(业务逻辑),存储库(连接到数据库,也称为DAOs)和模型类(由控制器接收并经常映射到数据库实体的对象类)。让我们将其映射到MVC“组件”:
视图 - 在Spring应用程序中不存在;
控制器 - Rest控制器(或只是控制器,这取决于您如何构建应用程序);
模型 - 服务、存储库、模型类(???)。
我在这里感到困惑,因为我们在左右两侧都有模型。
谢谢。
编辑:添加代码片段和应用程序结构。
这是Spring应用程序通常的外观。大多数人都这样做。
.
├── BasicSpringAppApplication.java
├── controller
│   └── CustomerController.java
├── model
│   └── Customer.java
├── repository
│   └── CustomerRepository.java
└── service
    └── CustomerService.java

这是Java文件中模型/实体的样子:
package com.example.basicspringapp.model;

public class Customer {
    private String id;
    private String name;
    private String surname;
    private int age;

    //constructors, getters, setters
}

看看我所说的(以及通常所说的)模型,只是一个特定的东西,一个实体。但在MVC中,它不仅仅是这样!模型不仅包括实体,还包括服务和存储库等任何不是视图和控制器的东西。

为什么在通常的Spring应用程序中MVC模式会混乱?对我来说似乎很混乱。为什么人们不将这些类称为实体或类似于此的东西?因为模型对于MVC而言不仅仅是如此。


你好。你所说的“映射到数据库实体表的类”和“映射到数据库实体的对象类”是什么意思?更准确地说,你所提到的“实体表”和“数据库实体”是指什么?如果能提供一些代码会更有帮助。 - PajuranCodes
@dakis 你好。你提到的事情意思是一样的。一个例子可以是Customer,作为一个实体。如果你有一个网站,保存客户列表和他们的信息,Customer将会是Java中的一个模型类,它会有一些字段,如nameagelocation等等。在Hibernate中,我会将其声明为一个实体,在数据库中,我会为其创建一个表,并将其id作为主键。 - Sandro J
再次问候。如果您能提供一些代码,那将更清晰明了。 - PajuranCodes
1
如果你的customer.java类只有属性,并且是底层持久性对象/表的表示,则通常称为数据传输对象(DTO)。模型类保存存储和检索数据的逻辑,并将该数据形状/投影为DTO。那么,你对两侧都有模型的困惑就不会出现了。 - Anand Sowmithiran
1
Spring(春季框架)滥用著名的模式名称进行营销。这是一种有效的营销策略,但对开发社区来说是一种极其恶劣的伤害,因为它污染了我们的术语。再加上所有不同的MVC扩展和部分重叠,你就会得到一堆词汇,只在孤立的上下文中一致使用,但在不同的上下文中常常混淆。 - jaco0646
显示剩余2条评论
1个回答

1

MVC模式应用中的模型:

在MVC模式应用中,领域模型(或简称为模型)反映了某个业务。它作为一个层——模型层业务层进行编程,并由多个不同类型的对象组成:

  • 数据映射器:在实体和所选持久化空间(数据库、会话、通过SOAP访问的远程存储库等)之间传输数据。
  • 仓储:也是在实体和所选持久化空间之间传输数据,但是使用来自数据映射器层的数据映射器。它们构建了一个附加层,以将持久化空间的类型隐藏起来。每个仓储对象都被编码为一种特定类型的实体集合,可以像集合一样访问。因此,例如,Book实体的集合可以命名为BookCollectionLibraryBooksRepository,并包含用于处理类型为Book的对象集合的方法,如:“查找/获取/删除/更新/存储/存在/计数等书籍集合中的书籍”
  • 实体领域对象:用于保存特定业务所需的数据和行为。这些组件包含与它们使用的应用程序无关的业务逻辑。换句话说,它们可以被多个应用程序重复使用。
  • 值对象
  • 服务作为服务层的一部分。这些对象也包含业务逻辑,但与实体相比,它们的业务规则取决于它们所使用的应用程序。由于这个事实,服务类是否应该定义为领域模型的一部分或交付机制的一部分是有争议的(请参见下面的前两个资源)。

因此,在MVC模式应用中:

  • Model不是一个类,而是具有不同职责的对象层;
  • Model实体服务中都包含业务逻辑;
  • 领域对象包含数据行为

单独看实体,它们不会以任何方式映射到任何持久性系统(如数据库)。它们的属性和方法通过使用特定于业务的词汇来反映特定的业务,因此完全独立于所选择的持久性系统的结构。只有数据映射器才知道并且只有他们知道如何在域对象的属性和数据库记录的结构之间进行映射。

在下面的前两个资源中,您将发现,在基于MVC的应用程序中,持久性系统(数据库等)不会决定应用程序的结构。 持久性系统只是一个细节

注意事项:

  • 服务层之外的其他组件注入到控制器中会导致错误地在其中具有业务逻辑。控制器的唯一目的应该是将用户请求的处理委托给服务层
  • 对象关系映射系统(ORM)的优缺点存在争议。

资源:


谢谢@dakis。但我认为这是一个普遍的答案。我对通常应用程序中人们搞砸这些事情的情况很感兴趣。 - Sandro J

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