我一直在使用developing框架来开发Microservices。最近,我开始探索NestJS,并有一个关于构建响应DTO的问题。
在Spring中,控制器是轻量级的,它们传递对服务层的调用。
服务层实现业务逻辑,最后,它们调用负责构建响应DTO的Mapper类。mapper类可能与将实体克隆到DTO一样简单,也可能使用多个DB实体对象构建复杂对象。
在NestJS中,大多数示例都使用class-transformer
。但我不确定class-transformer
是否足以构建复杂的对象。对我来说,class-transformer
基本上是克隆对象。在Spring中对应的值是
BeanUtils.copyProperties(workingWellCompositeMemberContactTrace, workingWellDailyMemberAggEntity);
所以我的问题是在NestJS中,哪一层负责构建复杂的响应对象?将实体对象发送给Controller是一个很好的实践吗?
发布于 2022-04-28 06:47:47
另一个答案中的人画出这幅图,它解释了NestJS内部请求的生命周期(向该人大声呼喊):
要回答您的问题:what layer is responsible for building complex response objects?
--我说拦截器是处理请求的最后一点逻辑,但我猜您要问的是“实体在哪里自动将转换为do?”这就解释了你的第二个问题: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
发布于 2022-10-17 20:15:25
Nestjs为DTO提供了PartialType()、PickType()、OmitType()等辅助方法,您可能需要在这里阅读:https://docs.nestjs.com/techniques/validation#stripping-properties
https://stackoverflow.com/questions/72038893
复制相似问题