NestJS:如何从同一个模块将服务注入提供者?

Posted

技术标签:

【中文标题】NestJS:如何从同一个模块将服务注入提供者?【英文标题】:NestJS: How to inject a service into a provider from the same module? 【发布时间】:2020-07-18 21:38:00 【问题描述】:

是否可以从同一模块将服务注入工厂提供程序?我有一个服务AppService,我想在下面的这个工厂提供者中使用它。

这是我的代码:

app.module.ts

@Module(
  imports: [
    MongooseModule.forFeatureAsync([
        
            name: 'List',
            imports: [AnotherModule],
            useFactory: (anotherService: AnotherService) => 
                const schema = ListSchema;
                schema.pre('save', function() 
                    // Validate
                )
                return schema;
            ,
            inject: [AnotherService],
        ,
  ],
  providers: [AppService],
  exports: [AppService],
)
export class AppModule 

我希望能够做这样的事情:

app.module.ts

@Module(
  imports: [
    MongooseModule.forFeatureAsync([
        
            name: 'List',
            imports: [AnotherModule, AppModule],
            useFactory: (anotherService: AnotherService, appService: AppService) => 
                const schema = ListSchema;
                schema.pre('save', function() 
                    // Validate
                )
                return schema;
            ,
            inject: [AnotherService, AppService],
        ,
  ],
  providers: [AppService],
  exports: [AppService],
)
export class AppModule 

这不起作用。 Nest 无法初始化所有依赖项,应用程序无法运行。

甚至可以做这样的事情吗?

如何将同一模块中的服务注入此工厂提供程序?一种解决方案是将该服务移动到不同的模块,然后注入该服务。但是,如果可能的话,我想避免这种情况。

【问题讨论】:

【参考方案1】:

不可能将当前模块中的服务添加到当前模块作为其引导程序的一部分导入的模块中,因为这将是两者之间的主要循环依赖。你也许可以通过一些有趣的forwardRef() 函数来绕过它,但总的来说,应该避免这种模式,因为它会给代码库带来混乱

【讨论】:

谢谢,这很有道理。我正在调查forwardRef(),但正如你所指出的,这似乎不适合我正在尝试做的事情。我最好将逻辑移动到一个单独的模块然后注入它。感谢您的帮助!

以上是关于NestJS:如何从同一个模块将服务注入提供者?的主要内容,如果未能解决你的问题,请参考以下文章

NestJS 在非模块文件中注入模块服务

如果模型仅在根模块中,如何注入模型

如果模型仅在根模块中,如何注入模型

如何将 NestJS 中的服务注入 typeorm 存储库?

如何在 NestJS 中跨模块全局注入价值?

Nestjs 依赖注入 - 将服务注入服务