【问题标题】:Direct access to NestJS DI container直接访问 NestJS DI 容器
【发布时间】:2021-08-26 14:39:27
【问题描述】:

我用 NestJS 工作了 4 个月,之前用 PHP 工作了 5 年。 特别是使用 PHP 和 Symfony,我可以选择访问已编译的 DI 容器并根据需要从中获取任何服务。

如果我们有一个带有服务的应用程序 (A B C) 和 A 依赖于 BC 我能够在控制器甚至其他服务中调用容器,这些服务都知道容器,并使用已编译的 AC 服务来满足我的需要。

NestJS DI 是否有这样的选项 - 通过某个 ID 调用某些服务?我试图搜索它,但最终一切都只能使用已编译的服务,无法直接访问。

UPD:我有兴趣从非@Injectible 类访问 DI 容器。例如:

export class StatefulCruncherClass{

    constructor(private dataToCrunch:any){
          
    }

    async crunch(){
        if (this.dataToCrunch.isObject){
             return NestJs.getDI().get('ObjectsCruncher').crunch(this)
        } else {
             return NestJs.getDI().get('ArrayCruncher').crunch(this)
        }
    }
}

【问题讨论】:

    标签: typescript dependency-injection nestjs


    【解决方案1】:

    您可以为此使用moduleRef (docs)

    @Injectable()
    export class CatsService implements OnModuleInit {
      private service: Service;
      constructor(private moduleRef: ModuleRef) {}
    
      onModuleInit() {
        this.service = this.moduleRef.get(Service);
      }
    }
    

    尝试在静态(非注入)上下文中访问容器对我来说似乎很可疑,我认为这可能指向您尝试构建的功能的设计/架构问题。那时你肯定是在“对抗”框架。

    您需要以不可注射方式访问的原因是什么?

    您唯一的其他选择是以某种方式使实际的 Nest 应用程序实例可用于导入其他文件,但我强烈建议不要这样做。

    【讨论】:

    • 感谢您的回复!它接近我需要的东西,但我错过了重要的细节。添加了 UPD 部分
    • @Tesmen 我认为对于您想要完成的事情没有任何答案,这并不是非常骇人听闻的。您可以更新您的问题以提供更多背景信息,说明您为什么首先尝试完成此操作,我也许可以提供一些其他方法供您考虑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多