Nest.js 实施了 TypeORM Active Record 的项目
Nest.js project with TypeORM Active Record implementation
我正在尝试使用 Nest.js 和 TypeORM 构建一个项目。我喜欢 TypeORM
中的 Active Record approach
我用一些静态辅助方法定义了一个实体如下:
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 为您提供了一种在测试中模拟依赖项的非常方便的方法。这是唯一可能的,因为你在你的模块中声明了你的依赖关系,并且注入器决定了将使用什么实际实现。当您通过使用静态方法具有隐式依赖项时,很难在您的单元和集成测试中模拟它们,而在数据库访问的情况下您肯定想要这样做。
除了测试之外,当您从任何地方进行静态访问时,您的依赖项可能会变得混乱。在您的模块中声明依赖关系非常有助于保持您的代码整洁。
我正在尝试使用 Nest.js 和 TypeORM 构建一个项目。我喜欢 TypeORM
中的 Active Record approach我用一些静态辅助方法定义了一个实体如下:
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 为您提供了一种在测试中模拟依赖项的非常方便的方法。这是唯一可能的,因为你在你的模块中声明了你的依赖关系,并且注入器决定了将使用什么实际实现。当您通过使用静态方法具有隐式依赖项时,很难在您的单元和集成测试中模拟它们,而在数据库访问的情况下您肯定想要这样做。
除了测试之外,当您从任何地方进行静态访问时,您的依赖项可能会变得混乱。在您的模块中声明依赖关系非常有助于保持您的代码整洁。