В моей библиотеке есть декоратор, который объединяет два декоратора:
SetMetadata
and
Injectable
.
export const EventTrackerFor = (schema: AnyClass, injectionOptions?: ScopeOptions) =>
applyDecorators(SetMetadata('tracker-for', schema.name), Injectable(injectionOptions));
Итак, пользователь создаёт схему и трекер событий для неё:
@modelOptions({ schemaOptions: { collection: 'Tests' } })
export class SomeSchema {
@prop()
some_field: string;
}
@EventTrackerFor(SomeSchema)
export class AnimalTracker {
constructor(private readonly appService: AppService) {}
@Post(PostEvents.FIND)
executeAfterSaving() {
console.log(this.appService);
}
}
И кладёт этот самый трекер событий в массив провайдеров:
@Module({
imports: [
KindagooseModule.forRoot(
'...connectionUri...',
),
KindagooseModule.forFeature([{ schema: SomeSchema }]),
],
controllers: [AppController],
providers: [AppService, AnimalTracker],
})
export class AppModule {}
Трекинг событий работает замечательно, но вот почему-то
AppService
не заинжектился,
console.log
выводит
undefined
. В чём причина такого поведения? Тут просто достаётся метод из трекера и кладётся в
schema.pre
или
schema.post
.
Возможно, эти исходники что-то прояснят:
- https://github.com/GrapeoffJS/kindagoose/blob/mast...
- https://github.com/GrapeoffJS/kindagoose/blob/mast...