module - Nest.js : Circular dependencies in dynamic modules

标签 module nestjs circular-dependency

当动态模块之间存在循环依赖时,导入动态模块的正确方法是什么?我只是更改了forwardRef(() => MyModule)forwardRef(() => MyModule.forRoot()) ,我得到 Nest can't resolve dependencies错误。

最佳答案

处理嵌套模块依赖关系的最好方法是始终通过模块而不是通过服务导入依赖关系。如果遇到循环依赖,nest 会显示一个错误,您可以使用 forwardRef() 轻松修复它。
假设您的应用程序有 3 个紧密耦合的模块。

  • @moduleA()
  • @moduleB()
  • @moduleC()

  • 和两个配套模块
  • @moduleX()
  • @moduleY()
  • @moduleZ()

  • 此外,所有模块都在导出具有相同名称的服务。
    考虑一种情况

    @moduleA() imports [serviceB, serviceX]



    @moduleB() imports [serviceA, serviceY, serviceZ]


    现在在 @moduleC()如果你想使用 serivceA() 那么你将不得不

    @moduleC() imports [serviceA, serviceB, serviceX, serviceY, serviceZ]


    在大多数情况下,nest 会抛出正确的错误,说明在哪里缺少哪个依赖项。但有时,nest 只在 [ index 处表示依赖。 ] 丢失,nest 没有说明丢失的位置。这将导致很大程度的困惑。
    一种简洁的方法是始终导入模块

    @moduleA() imports [moduleB, moduleX]

    @moduleB() imports [moduleA, moduleY, moduleZ]

    @moduleC() imports [moduleA]



    如果 Nest 再次提示依赖问题,则使用 forwardRef 导入模块
    @module({
         imports: [
           forwardRef(() => ModuleA)
           ModuleB
           ],
        controllers: [],
        providers: []
    })
    

    有时即使完成了所有这些操作,您也可能再次遇到依赖项不可用错误。然后你可以使用 ModuleRef .让我们以相同的示例为例,您想在 ModuleC() 中使用 ServiceA()
    然后,您将在 ModuleC() 和 serviceC() 类中将 serviceA() 添加到 providers[] 中,您需要添加以下内容。
    import { Injectable, OnModuleInit } from '@nestjs/common'; \\need OnModuleInit 
    import { ServiceA} from '../FolderA/serviceA.service';
    
    export class ServiceC implements OnModuleInit {
       
       private serviceA: ServiceA;
       constructor(private readonly moduleRef: ModuleRef) {}
    
       onModuleInit() {
            this.serviceA= this.moduleRef.get(ServiceA);
        }
       
       foo(){
         console.log(this.serviceA.someFunction())
       }
    }
    
    更多详情请访问 Official documentation .

    关于module - Nest.js : Circular dependencies in dynamic modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56432814/

    相关文章:

    c# - 多接口(interface)装饰器——Autofac 中的循环依赖之谜

    python 包已安装但无法导入

    javascript - ReferenceError : BASE_URL is not defined, Angular JS 依赖项

    java - 与模块相比,在 Play Framework 2 中创建/使用插件有哪些优点/差异?

    nestjs - 使用@Injectable Scope/@Inject(REQUEST) NestJS 测试类

    Nx 上的 Nestjs REPL

    java - 如何避免两个类之间的循环依赖?

    Python 在脚本中记录导入模块版本的最佳方法

    angular - Docker nginx 代理 websocket 获取 404

    c++ - 打破工厂模式中的循环依赖