在nestJs DI中有条件实例化服务

问题描述 投票:0回答:1

我有两个类,

FilesLocalService
仅需要在开发模式下加载,
FilesCloudService
仅需要在生产模式下加载

所以我做了这样的事情:

 providers: [
    {
      provide: FilesService,
      useClass: 
        process.env.NODE_ENV === 'development'
          ? FilesLocalService
          : FilesCloudService,
    },

    //<------ This makes Nestjs always instantiate both services 
    FilesLocalService, 
    FilesCloudService
  ],

问题是

FilesLocalService
FilesCloudService
都在 prod 和 dev 模式下加载 我需要Nestjs根据当前环境只实例化所需的类

另外,我需要让 Nestjs 解决这两个问题,而无需手动启动类,即通过使用

useFactory

解决 出现问题是因为我在

FilesLocalService
中添加了
FilesCloudService
exports[]
,所以我们需要提供它们。 通过从
exports[]
中删除它们,我们也可以从
providers[]

中删除它们
nestjs
1个回答
1
投票

您可以编写一个动态模块,该模块将根据以下条件返回正确的提供程序:

export class Foo {
  static register(env: 'local' | 'cloud') {
    let provider;
    if (env === 'local') provider = FilesLocalService;
    if (env === 'cloud') provider = FilesCloudService;
    return {
     module: Foo,
     providers: [{provide: FilesService, useClass:provider}],
     exports: [FilesService],
   };
  }
}

然后将其导入到将使用

FilesService
提供程序的模块中:
Foo.register(process.env.NODE_ENV === 'development' ? 'local' : 'cloud')

© www.soinside.com 2019 - 2024. All rights reserved.