Как справиться с инъекцией зависимостей NestJS при расширении класса для службы? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь предоставить услугу, отличную от моей ConfigService.

Проблема, с которой я сталкиваюсь, заключается в том, что внедряемая модель мангуста не возвращает никаких значений при выполнении таких методов запроса, как findOne() (результат null) или countDocuments() (результат 0).

Мои классы обслуживания определены следующим образом:

export class BaseService {
  constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {}

  createService(option: string) {
    if (option === 'OTHER') {
      return new OtherService(this.catModel);
    } else if (option === 'ANOTHER') {
      return new AnotherService(this.catModel);
    } else {
      return new BaseService(this.catModel);
    }
  }

  async findOne(id: string): Promise<Cat> {
    return await this.catModel.findOne({_id: id});
  }

  async count(): Promise<number> {
    return await this.catModel.countDocuments();
  }

  testClass() {
    console.log('BASE SERVICE CLASS USED');
  }
}

@Injectable()
export class OtherService extends BaseService {
  constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {
    super(catModel);
  }

   testClass() {
    console.log('OTHER SERVICE CLASS USED');
  }
}

@Injectable()
export class AnotherService extends BaseService {
  constructor(@InjectModel('Cat') public readonly catModel: Model<Cat>) {
    super(catModel);
  }
  testClass() {
    console.log('ANOTHER SERVICE CLASS USED');
  }
}

Это позволяет мне получить правильный сервис от моего провайдера (testClass() печатает ожидаемую строку).Мой провайдер выглядит так:

export const catProviders = [
  {
    provide: 'CatModelToken',
    useFactory: (connection: Connection) => connection.model('CAT', CatSchema),
    inject: ['DbConnectionToken'],
  },
  {
    provide: 'BaseService',
    useFactory: (ConfigService: ConfigService, connection: Connection) => {
      const options = ConfigService.get('SERVICE_TYPE');
      let model = connection.model('CAT', CatSchema);
      return new BaseService(model).createService(options);
  },
  inject: [ConfigService, 'CatModelToken', 'DbConnectionToken'],
  }
];

Так что мой вопрос состоит из двух частей:

  • Есть ли лучший способ справиться с созданием правильного класса и избежать необходимостисоздать экземпляр BaseService с единственной целью вызова createService()?
  • Как правильно внедрить модель мангуста во вновь созданный сервис?

Я также не могуиспользуйте пример useClass из документации, так как мне нужно иметь возможность ввести ConfigService.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...