【问题标题】:Can this kind of dependency injection be achieved with NestJS?这种依赖注入能用 NestJS 实现吗?
【发布时间】:2019-11-25 03:03:22
【问题描述】:

我想以简短的方式将 Nest 服务方法的结果作为依赖项注入。示例是一个日志记录工具,其中子记录器从具有新前缀的主记录器派生而来。

应该是这样的(长版):

@Injectable()
class MyService {
  private logger;

  constructor(private loggerService: LoggerService) {
    this.logger = loggerService.getChildLogger('prefix');
  }

  someMethod() {
    this.logger.info('Hello');
  }  
}

但在一个简短的版本中,像这样 - 可能带有装饰器:

@Injectable()
class MyService {
  constructor(@logger('prefix') logger: LoggerService) {
  }

  someMethod() {
    this.logger.info('Hello');
  }  
}

【问题讨论】:

    标签: dependency-injection decorator nestjs


    【解决方案1】:

    您可以使用注入 LoggerService 的工厂为您的记录器创建提供程序:

    LoggerService:

    @Injectable()
    export class LoggerService {
      getChildLogger(scope: string) {
        return new Logger(scope);
      }
    }
    

    MyService:

    @Injectable()
    export class MyService implements OnModuleInit {
      constructor(@Inject('MY_SERVICE_LOGGER_TOKEN') public childLogger) {}
    
      onModuleInit() {
        this.childLogger.log('Hello World');
      }
    }
    

    模块:

    @Module({
      providers: [
        LoggerService,
        MyService,
        {
          provide: 'MY_SERVICE_LOGGER_TOKEN', 
          useFactory: (loggerService) => loggerService.getChildLogger('scope'), 
          inject: [LoggerService]
        },
      ]
    })
    export class MyModule {}
    

    【讨论】:

    • 我只想为每个服务/类而不是每个模块设置范围。但是感谢您的解决方案。
    【解决方案2】:

    现在 Livio Brunner 提供了一个解决方案: https://github.com/BrunnerLivio/nestjs-logger-decorator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2021-04-06
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多