nestjs - 带有 TypeORM 活动记录实现的 Nest.js 项目
问题描述
我正在尝试使用 Nest.js 和 TypeORM 构建一个项目。我喜欢TypeORM 中的Active Record 方法
我用一些静态辅助方法定义了一个实体,如下所示:
export class Book extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
description: string;
static async createNew(attributes: BookDto): Promise<Book> {
const entity = new Book();
entity.name = attributes.name;
entity.description = attributes.description;
return entity.save();
}
static async findByName(name: string): Promise<Book> {
return Book.findOne({
where: { name },
});
}
}
我正在尝试按照 Nest 文档中的模式将其注入我的服务:
@Injectable()
export class BookService {
constructor(
@InjectRepository(Book)
private readonly bookRepository: Repository<Book>,
) {}
async create(bookAttrs: BookDto): Promise<Book> {
return Book.createNew(bookAttrs);
}
}
但正如您在我的服务中看到的,我只使用静态方法。在这种情况下,我什至需要注入依赖项吗?我应该遵循更好的模式吗?
解决方案
如果您采用这种方法,则无需Repository
在服务中注入,甚至不必TypeOrmModule.forFeature([User])
在功能模块中导入,因为您没有注入任何与 TypeOrm 相关的东西,因为您使用的是( ) 可以在任何地方使用的静态方法。
但是,我不建议这样做,最重要的原因是测试:Nest 为您提供了一种非常方便的方式来模拟测试中的依赖项。这仅是可能的,因为您在模块中声明了依赖项,并且注入器决定将使用什么实际实现。当您使用静态方法具有隐式依赖项时,很难在您的单元和集成测试中模拟它们,这在您肯定想要访问数据库的情况下。
除了测试之外,当您从任何地方进行静态访问时,您的依赖关系可能会变得混乱。在您的模块中拥有声明性依赖关系对于保持代码清洁非常有用。
推荐阅读
- javascript - 错误:参数“数据”的值不是有效的 Firestore 文档。不能使用“未定义”;作为 Firestore 值
- reactjs - Netlify-forms 联系表单提交 404 错误
- python - Python - 类方法返回对象。如何读取对象数据?
- reactjs - 如何将 Draggable 捕捉到网格?(材质界面)
- amazon-web-services - Postman 上的 AWS 响应超时
- android - 如何在android上运行python脚本进行输入和获取输出
- python - 将 xml 文件转换为 tfrecord 文件时出错
- javascript - Steam Bot - 发送您的交易报价时出错。请稍后再试。(26)
- crud - 类 DateTime 的 EasyAdmin 3 对象无法转换为字符串
- java - 如何使文件路径与嵌入式数据库兼容?(Apache Derby 嵌入式)