MVC模型对象,域对象和DTO之间有什么区别

Tim*_*lem 62 architecture model-view-controller model dto

MVC模型对象,域对象和DTO之间有什么区别?

我的理解是:

MVC模型对象:

为相应视图显示的数据建模.它可能不直接映射到域对象,即可能包括来自一个或多个域对象的数据.

  1. 客户端
  2. 可能包含业务逻辑.例如.验证,计算属性等
  3. 没有持久性相关的方法

域对象:

用于对问题域中的现实世界对象进行建模的对象,如预留,客户,订单等.用于保存数据.

  1. 服务器端
  2. 没有业务逻辑

DTO(数据传输对象):

当层处于单独的进程中时,用于在层之间传输数据的对象,例如从DB到客户端应用程序.在获取与多个域对象相对应的数据时,允许跨线的单个事务而不是多个调用.DTO仅包含数据和访问器方法,并且不存在逻辑.该数据用于特定的DB事务,因此它可以或可以不直接映射到域对象,因为它可以包括来自一个或多个域对象的数据.

  1. 在层之间传递时,在服务器端和客户端使用
  2. 没有业务逻辑
  3. 没有持久性相关的方法

所以,问题:

  1. 以上理解是否正确?我错过了一些关键点吗?

  2. 是否有任何理由不使用Domain对象作为MVC模型,假设Model对象不需要额外的业务逻辑?

  3. 是否有任何理由不使用DTO作为MVC模型,假设Model对象不需要额外的业务逻辑?

Pro*_*ofK 16

域和模型对象本质上是相同的,可能包含业务逻辑.根据实现,如果将业务逻辑从模型中移除到服务类中,则域和DTO对象可能是等效的.

通常,DTO的一个关键变体是视图模型,它纯粹用于在域模型和视图之间传输数据,尽管视图模型通常可能包含逻辑,尽管这应该是纯粹的UI逻辑.

  • 只需要一个单独的MVC Model对象来封装与在视图中显示数据相关的逻辑.如果没有,则更容易将域对象用作MVC Model对象. (2认同)

kar*_*eek 8

Domain和DTO也可以是您的"模型"对象 - 您可以拥有一个视图来呈现"Customer"域对象的详细信息.

域对象可以具有业务逻辑来强制执行域实体的属性.验证就是这样一种情况.域对象本身不包含与持久性相关的方法,但它可以具有元数据(如注释)以支持持久性

POJO编程模型可以使用与您的域,DTO和模型对象相同的对象 - 实际上,您不会实现任何只应用于一个层但不适用于其他层的无关接口.


小智 7

MVC 和 DDD 可以一起使用。我们在 DDD 和 MVC 中所说的“模型”实际上是相同的:抽象。我们可以使用伪代码来说明一些示例。

模型视图控制器 (MVC)

模型视图控制器架构将软件分为三个部分:

模型层

MVC 架构中的模型层是逻辑所在的位置。在这一层中,我们有我们的模型和业务逻辑。

class Car {

  String color;
  String year;  

  Cat(color, year) {
    this.color = color;
    this.year = year;
  }

  //getters & setters
}
Run Code Online (Sandbox Code Playgroud)

一个简单的汽车抽象。

class CarService {

  save(car) {
    if(car.getColor() != null && car.getYear() != null) {
      methodToSave(car);
    } else {
      throwsException();
    }
  }

  find(car) {
    return methodToFind(car);
  }

  update(car) {
    assertThatExists(car);
    methodToSave(car);
  }

  delete(car) {
    assertThatExists(car);
    methodToDelete(car);
  }
}
Run Code Online (Sandbox Code Playgroud)

使用服务的汽车的简单 CRUD

视图层

视图层是用户界面所在的层。用户可以在此处与系统交互,然后系统将触发所执行的操作的控制器,然后控制器将通知模型层并请求数据。视图层可以驻留在应用程序的客户端或应用程序的服务器端(即:JSF(Java Server Faces)作为服务器端,ReactJS 作为客户端)。不管怎样,即使View层驻留在客户端,客户端也需要请求服务器端发送请求。这可以通过基于 Web 应用程序的 HTTP 请求来完成。

<theCarPage>
  <theCar>
    getTheCarOnLoad();
  </theCar>
</theCarPage>
Run Code Online (Sandbox Code Playgroud)

汽车的伪页面。

控制器层

控制器层基本上接收来自视图的输入,然后转换数据并将其发送到模型层,反之亦然。

class CarController {
  
  @OnLoadingTheCarPage
  getTheCarOnLoad() {
     return theCar();
  }

}
Run Code Online (Sandbox Code Playgroud)

加载汽车的方法。

领域驱动设计(DDD)

领域驱动设计是一个概念: DDD 的基础是类、类变量和类方法必须与其核心业务领域相匹配的概念。

领域驱动设计位于“M”中

在这种情况下,当应用 MVC 时,领域驱动设计驻留在 MVC 架构的模型层中。如前所述,模型层是应用程序的业务逻辑所在的位置。

无论您是否有实体,它们仍然是模型。模型只是现实世界中某些事物的抽象。如果抽象的话,猫可以是模型:

class Cat {
  
  String color;
  String age;  

  Cat(color, age) {
    this.color = color;
    this.age = age;
  }

  //getters & setters
}
Run Code Online (Sandbox Code Playgroud)

简单的猫抽象。这是猫的模型。

DDD实体

在领域驱动设计中,我们有实体,它们也被归类为模型。它们之间的区别在于实体是可识别的。如果您有一个可识别且可以持久化的类,那么它就是一个实体。实体仍然是模型。

@AnEntity
@ThisCanBePersisted
class Cat {
  
  @ThisIsAnId
  @ThisValueIncrementsAutomatically   
  @PersistentProperty
  Long id;
  @PersistentProperty
  String color;
  @PersistentProperty
  String age;  

  Cat(color, age) {
    this.color = color;
    this.age = age;
  }

  //getters & setters
}
Run Code Online (Sandbox Code Playgroud)

一个简单的实体。实体就是模型。

数据传输对象 (DTO)

数据传输对象内部没有逻辑,它们的唯一用途是作为将数据从一个端点传输到另一个端点的容器。通常企业实体本质上是不可序列化的,因此我们需要一种方法来仅发送需要发送给客户端的数据。例如,由于模型可能具有敏感数据或我们不想在获取请求中共享的简单数据,因此考虑我们的 Cat 模型,我们可以创建一个不共享 Cat ID 的 DTO:

class CatDTO {

  String color;
  String age;  

  //getters & setters
}
Run Code Online (Sandbox Code Playgroud)

Cat 的数据传输对象。我们只需要它的属性以及获取和设置属性的东西。我们不想分享它的 ID。

因此,例如,如果我们必须使用 REST 从客户端请求所有猫的列表,那么我们将请求使用 CatDTO 而不是 Cat 实体进行响应的端点:

[
  Cat {
    "color": "yellow",
    "age": "1"
  },
  Cat {
    "color": "black",
    "age": "4"
  }
]
Run Code Online (Sandbox Code Playgroud)

这就是我们的客户可以看到的所有数据。


Iul*_*scu 6

A DTO = is an object that carries data between processes.
Run Code Online (Sandbox Code Playgroud)

但最有趣的是,它除了存储和检索自己的数据外,没有任何行为!!!

坚持使用 MVC 方法...

Domain = subject of your entire application.

Model = contains the (programming languages objects : EX: C# objects) to make up the universe of your application.
Run Code Online (Sandbox Code Playgroud)

它们显然可以具有行为和属性(参见与 DTO 的区别)。

通常一个应用程序(一个轻量级的)可以有一个模型 - 在这种情况下,您的模型正是您的领域。另一个模型可以是完全不同的对象类型,即正在处理另一个对象类型。在这种情况下,它们都属于您的域,并被命名为“域模型 - 对象”。

希望这个答案是详尽无遗的,让您一目了然!


owe*_*kop 6

我的理解(简而言之)如下:

(MVC) 模型对象:

  • 在一些使用上下文中表示一些东西,例如。PersonEditModelPersonViewModel或者只是PersonModel
  • 没有业务逻辑
  • 可以是一些验证逻辑等的主题。
  • 用于将数据从一个应用层提供到另一个应用层,例如。MVC 控制器 <-> MVC 视图

域对象:

  • 代表一些业务对象(问题域中的真实世界对象)
  • 有业务逻辑
  • 不允许无效的对象状态,具有正确更改对象状态的方法
  • 用于封装与其相关的业务逻辑
  • 不必用于持久化数据(甚至不应该)

DTO(数据传输对象):

  • 类似于 Model 对象,但应该具有扁平结构
  • 只有简单类型的属性/字段(字符串、数字、日期时间、布尔值)
  • 用于跨应用程序边界传输数据,例如。在 Web 服务器和 Web 浏览器之间


Sin*_*tfi 5

大多数对象的定义根据对象的使用位置而有所不同:

Model:是在客户端服务器中使用对象的一般定义。

  1. Model View: 是一个使用 in 的对象client大多数时候
  2. Domain Object: 是一个使用 in和 的对象servertransfering data to the database
  3. Data Transfer Object(DTO):是一种将数据从一个对象传输到另一个对象的对象,特别是在获取数据时API Call(例如:在用于获取数据的 api GET 方法调用中,您不得将数据库模型提供给客户端,为此目的,您使用dto)。

注意:the definitions are true most of the time但在某些情况下并不实用。