【问题标题】:Custom Injectable in nest.js在nestjs中自定义注入
【发布时间】:2019-03-05 17:08:25
【问题描述】:

我创建了一个简单的日志记录服务,它通过 debug 在后台提供调试日志记录功能,可按如下方式使用:

@Resolver('Category')
export class CategoryResolver {
  private log: DebugLog;

  constructor(private readonly categoryService: CategoryService, loggingService: LoggingService) {
    // needs this to determine logger prefix
    this.log = loggingService.getDebugLogger(this);
  }

  @ResolveProperty()
  async mainCategory(category: Category, args, context): Promise<MainCategory> {
    this.log('resolving mainCategory');
    /* ... */
  }
}

现在,我想通过创建一个类似于@InjectRepository for @nestjs/typeorm@InjectLogger 装饰器来摆脱构造函数中的样板代码。基本上我想实现能够做到这一点:

@Resolver('Category')
export class CategoryResolver {

  constructor(
    private readonly categoryService: CategoryService, 
    @InjectLogger(CategoryResolver) private readonly log: DebugLog
  ) { }

  @ResolveProperty()
  async mainCategory(category: Category, args, context): Promise<MainCategory> {
    this.log('resolving mainCategory');
    /* ... */
  }
}

我将如何实现这样的目标?

【问题讨论】:

    标签: typescript dependency-injection nestjs


    【解决方案1】:

    @nestjs/typeorm@InjectRepository() 注入通过为每个注册实体添加单独的 DI 提供程序令牌来工作 - 请参阅 @nestjs/typeorm providers 以了解提供程序逻辑。该逻辑迭代每个已注册的@Entity,并为每个@Entity 生成并添加一个令牌提供程序。

    要执行与您的示例相匹配的类似操作,您需要能够为您将作为参数传递给@InjectLogger(&lt;type&gt;) 的每种类型识别并生成令牌和关联的提供程序。

    【讨论】:

    • 嗯,耻辱...我没有办法在请求之前了解所有必需的记录器。我很想避免在我的模块初始化代码中添加LoggingModule.prepareLoggers([CategoryService, CategoryResolver, AnotherService, ...] 之类的内容...
    猜你喜欢
    • 2021-10-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 2021-01-07
    • 2018-10-11
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多