NestJS,如何以及在何处构建响应 DTO
NestJS, how and where to build response DTOs
我一直在使用 Java Spring 框架来开发微服务。最近我开始探索 NestJS 并且有一个关于构建响应 DTO 的问题。
在Spring中,
controller是轻量级的,他们把调用交给了Service Layer。
服务层实现业务逻辑,最后,他们调用负责构建响应 DTO 的 Mapper classes。映射器 class 可能就像将实体克隆到 DTO 一样简单,也可能使用多个 DB 实体对象构建复杂对象。
在 NestJS 中,大多数示例都使用了 class-transformer
。但我不确定 class-transformer
是否足以构建复杂的对象。对我来说 class-transformer
基本上就是克隆对象。 Spring 中的等价物是
BeanUtils.copyProperties(workingWellCompositeMemberContactTrace, workingWellDailyMemberAggEntity);
所以我的问题是在 NestJS 中,哪一层负责构建复杂的响应对象?将 Entity 对象发送到 Controller 是一个好习惯吗?
另一个答案中有人画了这张图,解释了 NestJS 中请求的生命周期(向那个人大喊):
回答你的问题:what layer is responsible for building complex response objects?
好吧,我说拦截器是处理请求的最后一点逻辑,但我猜你问的是“实体在哪里转换 自动到DTO?”这将解释你的第二个问题:Is sending Entity object to Controller a good practice?
简短回答:视情况而定。
长答案:DTO 对于将您的请求逻辑与您的服务逻辑分离非常有用,有些值您可能不希望用户知道并且只是将它们填充到您的逻辑中......因此,这是一个很好的做法他们。但真的,想想你的项目,它的规模和你想要完成的事情,特别是现在你必须处理这种转换。
也就是说,实体和 DTO 之间的转换。您可以做的一件事是在参数之间进行完全手动设置:
export class UserDTO {
id: string;
name: string;
surname: string;
toEntity(dto:UserDTO) {
const model = new User();
model.id = id;
model.fullname = `${dto.name}, ${dto.surname}`
return model;
}
fromEntity(entity:User) {
const dto = new UserDTO();
dto.id = entity.id;
const [ name, surname ] = entity.(fullname as string).split(', ').map((name) => {name.tirm()});
dto.name = name,
dto.surname = surname;
}
}
另一方面,class-transformer
及其使用 instanceToPlain
和 plainToClass
可以完成很多事情。通过使用 Expose
和 Exclude
装饰器,您可以处理大多数用例。
如果这还不够,您可以使用类似的东西:https://www.npmjs.com/package/@automapper/nestjs
我一直在使用 Java Spring 框架来开发微服务。最近我开始探索 NestJS 并且有一个关于构建响应 DTO 的问题。
在Spring中, controller是轻量级的,他们把调用交给了Service Layer。
服务层实现业务逻辑,最后,他们调用负责构建响应 DTO 的 Mapper classes。映射器 class 可能就像将实体克隆到 DTO 一样简单,也可能使用多个 DB 实体对象构建复杂对象。
在 NestJS 中,大多数示例都使用了 class-transformer
。但我不确定 class-transformer
是否足以构建复杂的对象。对我来说 class-transformer
基本上就是克隆对象。 Spring 中的等价物是
BeanUtils.copyProperties(workingWellCompositeMemberContactTrace, workingWellDailyMemberAggEntity);
所以我的问题是在 NestJS 中,哪一层负责构建复杂的响应对象?将 Entity 对象发送到 Controller 是一个好习惯吗?
另一个答案中有人画了这张图,解释了 NestJS 中请求的生命周期(向那个人大喊):
回答你的问题:what layer is responsible for building complex response objects?
好吧,我说拦截器是处理请求的最后一点逻辑,但我猜你问的是“实体在哪里转换 自动到DTO?”这将解释你的第二个问题:Is sending Entity object to Controller a good practice?
简短回答:视情况而定。 长答案:DTO 对于将您的请求逻辑与您的服务逻辑分离非常有用,有些值您可能不希望用户知道并且只是将它们填充到您的逻辑中......因此,这是一个很好的做法他们。但真的,想想你的项目,它的规模和你想要完成的事情,特别是现在你必须处理这种转换。
也就是说,实体和 DTO 之间的转换。您可以做的一件事是在参数之间进行完全手动设置:
export class UserDTO {
id: string;
name: string;
surname: string;
toEntity(dto:UserDTO) {
const model = new User();
model.id = id;
model.fullname = `${dto.name}, ${dto.surname}`
return model;
}
fromEntity(entity:User) {
const dto = new UserDTO();
dto.id = entity.id;
const [ name, surname ] = entity.(fullname as string).split(', ').map((name) => {name.tirm()});
dto.name = name,
dto.surname = surname;
}
}
另一方面,class-transformer
及其使用 instanceToPlain
和 plainToClass
可以完成很多事情。通过使用 Expose
和 Exclude
装饰器,您可以处理大多数用例。
如果这还不够,您可以使用类似的东西:https://www.npmjs.com/package/@automapper/nestjs