带TypeORM的NestJS:使用自定义存储库时,是否不再需要一项服务?

时间:2018-08-26 20:27:33

标签: nestjs typeorm

新手问题: 在使用NestJS和TypeORM并创建了一个自定义存储库(扩展了标准存储库)时,是否不再需要单独的服务类?

此刻,我只使用自定义的Repository类,它可以正常工作,但是我不确定这是否正确,并且可能会有一些副作用。

顺便说一句,在另一个项目中,我没有自定义存储库,只有注入了两个标准存储库的服务,这也很好。

致谢,
萨格罗伯特

1 个答案:

答案 0 :(得分:8)

我认为由您决定要在typeORM和最“前台”代码(这是典型的嵌套应用程序中的控制器)之间添加层数。

我向自己解释:

如果需要,通常可以将内置的typeORM存储库直接注入到控制器中:

Scanner

因此,这将是如何检索ID = 1的用户的分层方法。

现在,NEST的文档建议抽象化此存储库,并将其注入服务中,而不是直接注入控制器中。这样可以减少控制器和TypeORM之间的绑定。而是,您的服务具有此绑定。如果您有许多使用此存储库的控制器,并且决定要更改TypeORM并使用新的高级ORM,则必须更改每个控制器。

现在,如果您只是将存储库注入服务中并在所有控制器中使用此服务,则只需更改服务的实现,所有控制器将保持不变。

第二,假设您要测试您的应用程序。您将面临同样的问题。没有SQL连接又如何运行测试?我想您的单元测试不是为了测试TypeORM行为而创建的,而是为了测试您的代码行为而编写的。

模拟注入服务中的存储库比模拟注入控制器中的所有存储库要容易得多。

因此,总结这个答案,我认为这个问题应该解决,因为它主要是基于观点的。但是恕我直言,梦architecture以求的架构如下:

  • 创建一个扩展TypeORM存储库的自定义存储库。
  • 在自定义存储库中,添加使用查询生成器的方法。
  • 将此自定义存储库注入您的服务
  • 将服务注入您的控制器中。

永远不要在控制器中使用查询生成器,因为很难模拟。

我希望这能回答您的问题:不需要服务类。但这将有助于您保持代码的整洁。