簡體   English   中英

NestJS - 如何提供動態模塊的服務

[英]NestJS - how to provide services of dynamic modules

我正在努力弄清楚如何提供從 DynamicModule 到常規模塊的服務。 偽代碼如下:

app.module.ts

@Global()
@Module({
  imports: [
    DynamicModule.forRoot(config),
    RegularModule,
  ],
  providers: [],
  exports: [],
})
export class AppModule {}

動態模塊.ts

@Module({})
export class DynamicModule implements OnModuleInit, OnModuleDestroy {
  constructor(private dynamicService: dynamicService) {}

  static forRoot(config: Config): DynamicModule {
    return {
      module: DynamicModule,
      imports: [],
      providers: [
        {
          provide: CONFIG_TOKEN,
          useValue: config,
        },
        DynamicService,
      ],
      exports: [
        DynamicService,
      ],
    };
  }
}

動態服務.ts

@Injectable()
export class DynamicService {

  constructor(
    @Inject(CONFIG_TOKEN) private readonly config: Config,
  ) {}
}

常規模塊.ts

@Module({
  imports: [],
  providers: [RegularService, DynamicService],
  exports: [RegularService],
})
export class RegularModule {}

常規服務.ts

@Injectable()
export class RegularService {

  constructor(
    private readonly dynamicService: DynamicService
  ) {}
}

向RegularModule 提供DynamicService 還需要在RegularModule 中提供CONFIG_TOKEN,如果更多模塊依賴於DynamicService 並且似乎不是正確的方法,這似乎很奇怪且不實用。

我缺少什么概念以及使用 DynamicModule 服務的正確方法是什么?

DynamicModule 方法中的 forFeature 會是正確的方向嗎?


動態模塊是需要某種上下文定義輸入的模塊,經典示例是數據庫模塊,它至少需要主機 url 和憑據,這會因應用程序而異。
這意味着當forRoot(input)返回時,您將擁有一個與任何常規(非動態)模塊一樣的模塊。 因此,您可以利用動態模塊服務中的config值,在動態模塊上導出服務,然后將該服務注入到導入動態模塊的其他模塊上。
無需在注入dynamicService的服務上也注入config值。

如果您需要直接訪問regularService中的config值,並且該值在多個服務和模塊之間共享,那么您應該查看ConfigModule並將該config值視為 env。 如果由於某些非常具體的原因它不能或不應該在 env 中,那么您仍然應該創建一個單獨的模塊來提供此config值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM