Пользовательские инъекционные в nest.js - PullRequest
0 голосов
/ 30 сентября 2018

Я создал простой сервис журналирования, который предоставляет функциональные возможности отладки через 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');
    /* ... */
  }
}

Теперь я хотел быизбавиться от стандартного кода в конструкторе, создав декоратор @InjectLogger, аналогичный @InjectRepository для @nestjs/typeorm.По сути, я хочу добиться того, чтобы сделать это вместо этого:

@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');
    /* ... */
  }
}

Как мне добиться чего-то подобного?

1 Ответ

0 голосов
/ 01 октября 2018
Инъекция

@nestjs/typeorm @InjectRepository() работает путем добавления отдельного токена провайдера DI для каждой зарегистрированной сущности - см. Логику провайдера @nestjs/typeorm .Логика выполняет итерацию для каждого зарегистрированного @Entity, а также для каждого генерирует и добавляет провайдер токенов.

Чтобы сделать что-то похожее, что соответствует вашему примеру, вам потребуется уметь идентифицировать и генерировать токен и связанный провайдер для каждого из них.введите, что вы передадите в качестве аргумента @InjectLogger(<type>).

...