我尝试使 Prisma 与 Automapper 一起使用(以便能够将模型映射到 Dtos 并返回)。 Prisma 有
schema.prisma
我们定义模型的地方,模型会自动为我们生成.. 但是它们生成时我们无法修改它们,但是我们需要,因为automapper需要添加装饰器使自动映射工作。那么,Prisma 与 automapper 一起使用是不是不可能呢?谢谢!
解决方案的关键在于一个两步过程,我们首先将 Prisma 模型转换为更可变的格式,可以根据需要进行装饰或操作,然后利用 AutoMapper 处理从这些适应模型到所需 DTO 的映射。这种方法使用
plainToInstance
包中的 class-transformer
函数将 Prisma 模型转换为类实例,然后可以对其进行增强或修饰。完成此转换后,可以使用 AutoMapper 将这些实例映射到 DTO。
我们需要创建反映 Prisma 模型结构的实体类。这些类将充当中介,允许我们附加装饰器或执行操作。
// user.entity.ts
import { AutoMap } from '@automapper/classes';
export class UserEntity {
@AutoMap()
id: number;
@AutoMap()
name: string;
@AutoMap()
email: string;
}
接下来,我们使用
plainToInstance
中的 class-transformer
将 Prisma 的普通对象转换为 UserEntity
类的实例。
import { plainToInstance } from 'class-transformer';
import { UserEntity } from './user.entity';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function findUserById(id: number): Promise<UserEntity> {
const user = await prisma.user.findUnique({ where: { id } });
return plainToInstance(UserEntity, user);
}
现在我们在
UserEntity
的实例中拥有了 Prisma 模型数据,我们可以使用 AutoMapper 轻松地将其映射到 UserDto
。首先,确保您的 AutoMapper 配置文件设置为从 UserEntity
映射到 UserDto
。
// automapper.profile.ts
import { ProfileBase } from '@automapper/classes';
import { UserDto } from './user.dto';
import { UserEntity } from './user.entity';
export class UserProfile extends ProfileBase {
constructor(mapper) {
super();
mapper.createMap(UserEntity, UserDto);
}
}
然后,您可以在服务层或任何需要转换数据的地方执行映射。
// userService.ts
import { AutoMapper } from '@automapper/classes';
import { UserDto } from './user.dto';
import { findUserById } from './yourUserFinderFunction'; // This function uses plainToInstance
async function getUserDtoById(id: number, mapper: AutoMapper): Promise<UserDto> {
const userEntity = await findUserById(id);
return mapper.map(userEntity, UserDto, UserEntity);
}
通过使用
plainToInstance
将这些模型转换为类实例,我们可以有效地利用AutoMapper将这些实例映射到DTO。这种方法可以保持数据层的完整性,同时利用强大的映射功能,遵循软件设计和架构的最佳实践。