typescript - Registrera manuellt en typeorm EventSubscriber i NestJS utan att specificera det i konfigurationsfilen


I NestJS utökade jag klassen EntitySubscriberInterface för att skapa en generisk EventSubscriber.
Mitt mål är att fånga alla typeorm-repositoryhändelser 'beforeInsert' varje gång jag infogar något i databasen (det bör utlösas för alla entiteter).

Den här koden fungerar eftersom filen är sparad i en av mapparna inne i src-mappen i NestJS och sökvägen till den anges i NestJS-konfigurationsfilen; på så sätt laddas subscriber-filen automatiskt.

Mitt mål skulle vara att flytta denna fil till ett npm-paket så att jag kunde extrahera den från huvudlogiken i NestJS-appen och sedan initiera den vid behov genom att göra något som 'new ValidatorSubscriber()';
Är det möjligt? Eftersom alla mina försök hittills har misslyckats.
Jag försökte i app.module.ts att initiera min ValidatorSubscriber-klass och konstruktorn kallas korrekt men sedan fungerar inte subcribers.
Någon idé?

import { EntitySubscriberInterface, EventSubscriber, InsertEvent } from 'typeorm';

@EventSubscriber()
export class ValidatorSubscriber<T> implements EntitySubscriberInterface<T> {

    private entitiesMap = new Map();

    constructor() {
        console.log('EventSubscriber constructor')
        import('../db/entities') // get all entities
            .then((allEntities: any) => {
                for (const prop in allEntities) {
                    this.entitiesMap.set(prop, allEntities[prop])
                }

                console.log(allEntities)
            });
    }
    /**
     * Called before post insertion.
     */
    async beforeInsert(event: InsertEvent<any>): Promise<void> {
        console.log(`BEFORE INSERTION, ${JSON.stringify(event.entity)}`)
    }
}

Svar #1

Om någon behöver det, lyckades jag hitta en lösning.

Jag kombinerade svaret från detta Stack Overflow-inlägg med svaret som ges här av fwoelffel (se skärmdump av svaret).
Tänk på att InjectConnection är föråldrat, jag använde detta istället:

constructor(
    @Inject(Connection) readonly connection: Connection,
) {

Svar #2

Min lösning var att sätta EventSubscriber inuti providers, och utelämna subscribers i dataSource-alternativen.

@Module({
  imports: [CustomerModule, TypeOrmModule.forFeature([Cart, Customer, Product])],
  controllers: [CartController],
  providers: [CartService, CustomerCartSubscriber],
  exports: [CartService]
})

Internals av CustomerCartSubscriber (fokus på att använda @Inject inuti konstruktorn):

@EventSubscriber()
export class CustomerCartSubscriber implements EntitySubscriberInterface<Customer> {
  constructor(
    @Inject(CartService) public readonly cartService: CartService,
    @Inject(DataSource) dataSource: DataSource
  ) {
    dataSource.subscribers.push(this);
  }

  listenTo() {
    return Customer;
  }

  async beforeInsert(event: InsertEvent<Customer>) {
    await this.cartService.createCart(event.entity);
  }
}

Som jag har konstaterat, även om jag lägger till prenumerant i leverantörer, men också aktiverar globala prenumeranter, så utelämnas mina injicerade tjänster? (undefined, trots att de finns i konstruktorn)