NestJS 中的模型与 DTO
Models vs DTO in NestJS
我对 NestJS 完全陌生。我已经看到在 NestJS 中,创建了一个模型来指定数据的细节,例如当创建一个简单的任务管理器时,当我们想要指定单个任务的外观时,我们在模型中指定它(下面的示例):
export interface Task {
id: string;
title: string;
description: string;
status: TaskStatus;
}
export enum TaskStatus {
OPEN = 'OPEN',
IN_PROGRESS = 'IN_PROGRESS',
DONE = 'DONE',
}
但是,我后来遇到了 DTO,其中再次描述了数据的形状。我的理解是 DTO 在传输数据时使用,即它描述了您将 post 或获得的数据类型。
我的问题是,当我已经在使用 DTO 来描述数据的形状时,为什么还要使用模型?
此外,我了解到使用 DTO 我们可以拥有单一的事实来源,如果我们意识到数据结构需要更改,我们将不必在控制器和服务文件中单独指定它,然而,这仍然意味着我们必须更新模型?
大多数情况下,在很长一段时间内,您的 DTO 和您的模型可以而且将会彼此不同。 HTTP 请求的结果和返回的内容可能采用与保存在数据库中的格式不同的格式,因此随着时间的推移将它们分开可以带来更大的灵活性。这基本上涉及 DTO (Data Transfer Objects) and DAO (Data Access Object) 与 DTAO(数据 Transfer/Access 对象)的争论(至少我是这样称呼它们的)。
这也涉及 Single Responsibility Principle,因为每个 class 应该处理一件事,而且只处理一件事。
There's also this SO post from a Java thread that talks about what you're thinking of
我对 NestJS 完全陌生。我已经看到在 NestJS 中,创建了一个模型来指定数据的细节,例如当创建一个简单的任务管理器时,当我们想要指定单个任务的外观时,我们在模型中指定它(下面的示例):
export interface Task {
id: string;
title: string;
description: string;
status: TaskStatus;
}
export enum TaskStatus {
OPEN = 'OPEN',
IN_PROGRESS = 'IN_PROGRESS',
DONE = 'DONE',
}
但是,我后来遇到了 DTO,其中再次描述了数据的形状。我的理解是 DTO 在传输数据时使用,即它描述了您将 post 或获得的数据类型。
我的问题是,当我已经在使用 DTO 来描述数据的形状时,为什么还要使用模型?
此外,我了解到使用 DTO 我们可以拥有单一的事实来源,如果我们意识到数据结构需要更改,我们将不必在控制器和服务文件中单独指定它,然而,这仍然意味着我们必须更新模型?
大多数情况下,在很长一段时间内,您的 DTO 和您的模型可以而且将会彼此不同。 HTTP 请求的结果和返回的内容可能采用与保存在数据库中的格式不同的格式,因此随着时间的推移将它们分开可以带来更大的灵活性。这基本上涉及 DTO (Data Transfer Objects) and DAO (Data Access Object) 与 DTAO(数据 Transfer/Access 对象)的争论(至少我是这样称呼它们的)。
这也涉及 Single Responsibility Principle,因为每个 class 应该处理一件事,而且只处理一件事。
There's also this SO post from a Java thread that talks about what you're thinking of