Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nestjs 使用TypeORM活动记录实现的Nest.js项目_Nestjs_Typeorm - Fatal编程技术网

Nestjs 使用TypeORM活动记录实现的Nest.js项目

Nestjs 使用TypeORM活动记录实现的Nest.js项目,nestjs,typeorm,Nestjs,Typeorm,我正在尝试用Nest.js和TypeORM构建一个项目。我喜欢打字 我使用一些静态助手方法定义了一个实体,如下所示: export类目扩展BaseEntity{ @PrimaryGeneratedColumn() id:编号; @第()列 名称:字符串; @第()列 描述:字符串; 静态异步createNew(属性:BookDto):Promise{ const entity=新书(); entity.name=attributes.name; entity.description=attrib

我正在尝试用Nest.js和TypeORM构建一个项目。我喜欢打字

我使用一些静态助手方法定义了一个实体,如下所示:

export类目扩展BaseEntity{
@PrimaryGeneratedColumn()
id:编号;
@第()列
名称:字符串;
@第()列
描述:字符串;
静态异步createNew(属性:BookDto):Promise{
const entity=新书();
entity.name=attributes.name;
entity.description=attributes.description;
返回entity.save();
}
静态异步findByName(名称:string):Promise{
还书,findOne({
其中:{name},
});
}
}
我尝试按照Nest文档中的模式将其注入到我的服务中:

@Injectable()
出口类图书服务{
建造师(
@知识库(书)
私有只读bookRepository:Repository,
) {}
异步创建(bookAttrs:BookDto):承诺{
返回Book.createNew(bookAttrs);
}
}

但正如您在我的服务中看到的,我只使用静态方法。在这种情况下,我甚至需要注入依赖项吗?有没有更好的模式我应该遵循?

如果你遵循这种方法,你不需要在你的服务中注入
存储库,你甚至不需要在你的功能模块中导入
类型或模块.forFeature([User])
,因为你没有注入任何类型相关的东西,因为你正在使用(全局)可以在任何地方使用的静态方法

但是,我不建议这样做,最重要的原因是测试: Nest为您提供了一种在测试中模拟依赖项的非常方便的方法。这只可能是因为您在模块中声明了依赖项,而注入器决定将要使用的实际实现。当您使用静态方法具有隐式依赖关系时,在单元和集成测试中很难模拟它们,而在数据库访问的情况下,您肯定希望这样做


除了测试,当您从任何地方进行静态访问时,依赖关系可能会变得混乱。在模块中具有声明性依赖关系对于保持代码整洁非常有用。

感谢您的帮助,我认为这不是一种非常“嵌套”的方式。然而,我确实喜欢活动记录的方法,这似乎是唯一的方式做到这一点。我希望看到一些这样实现的代码示例。文档似乎只在活动记录实体类型上显示静态方法:。更“嵌套”的方法是遵循数据映射器模式,这样您就可以在存储库上定义范围,而不是模型本身,然后在测试中模拟存储库的功能。