新手问题:
在使用 NestJS 和 TypeORM 时,有人创建了一个自定义存储库(它扩展了标准存储库),是否需要单独的服务类?
目前,我只使用自定义 Repository 类并且它工作正常,但我不确定这是否正确并且可能有一些副作用。
顺便说一句,在另一个项目中,我没有自定义 repo,只有一个注入(inject)两个标准 repo 的服务,这也很好。
问候,
萨杰罗伯特
最佳答案
我认为这取决于您要在 typeORM 和您最“前台”代码(这将是典型的嵌套应用程序中的 Controller )之间添加多少层。
我自己解释:
如果您愿意,您通常可以将内置的 typeORM 存储库直接注入(inject)到您的 Controller 中:
import {Controller, Get} from '@nestjs/common';
import {InjectRepository} from '@nestjs/typeorm';
import {Repository} from 'typeorm';
import {User} from './entities/User.entity';
@Controller()
export class AppController {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>,
) {
}
@Get()
async root(): Promise<User> {
return await this.userRepository.find(1);
}
}
所以这将是如何检索 ID = 1 的用户的较少分层的实现。现在,NEST 的文档建议抽象这个存储库并将其注入(inject)到服务中,而不是直接注入(inject)到 Controller 中。这使您可以减少 Controller 和 TypeORM 之间的绑定(bind)。相反,具有此绑定(bind)的是您的服务。如果您有许多使用此存储库的 Controller ,并且您决定要更改 TypeORM 并使用新的精美 ORM,则必须更改每个 Controller 。
现在,如果您只是将存储库注入(inject)到您的服务中并将该服务使用到您的所有 Controller 中,您只需要更改您的服务的实现,所有 Controller 都将保持不变。
其次,假设您想测试您的应用程序。你将面临同样的问题。如何在没有 SQL 连接的情况下运行测试?我想您的单元测试不是为了测试 TypeORM 行为而创建的,而是为了测试您的代码行为而编写的。
模拟注入(inject)服务的存储库比模拟注入(inject) Controller 的所有存储库要容易得多。
所以总结这个答案,我认为这个问题应该被关闭,因为它主要是基于意见的。但是IMO,梦想的架构如下:
永远不要在 Controller 中使用查询构建器,因为它很难模拟。
我希望这能回答您的问题:不需要服务类。但它会帮助你保持你的代码干净。
关于具有 TypeORM : When using custom repository, 的 NestJS 是否需要服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030009/