typescript - Injiser liste over grensesnitt i en klasse - NestJs


La oss si at jeg har dette grensesnittet:

export interface IParser {
  parse(text: string):string
}

og et par klasser som implementerer grensesnittet:

@Injectable()
export class FirstParser implements IParser {
   public parse(text: string): string {
     return text + 'first';
   }
}

@Injectable()
export class SecondParser implements IParser {
   public parse(text: string): string {
     return text + 'second';
   }
}

Nå har jeg en tjeneste som jeg prøver å injisere til ham liste over parser:

@Injectable()
export class ParserService {
    constructor(private readonly parsers: IParser[]) {}

    public parse(text: string): string {
        let parsedText = text;
        parsedText = this.parsers.reduce((acc: string, result) => {
            return result.parse(acc);
        }, parsedText);
        return parsedText;
    }
}

Jeg prøver å få appmodulen (i dette tilfellet parser-service.module.ts) til å fungere ved å injisere en array/liste av klassen inkludert FirstParser, SecondParser.

@Module({
    providers: [
        ParserService,
        {
          provide: Array<IParser>,
          useClass: ???,
        },
    ],
})
export class ParserServiceModule {}

Noen ideer? Er det i det hele tatt mulig i NestJs?

Takk.

Svar #1

Funksjonaliteten du prøver å oppnå har allerede blitt etterspurt som en funksjon, men har ikke blitt implementert på grunn av lav prioritet. Ta en titt på forespørselen om funksjonen.

Du kan imidlertid bruke factory provider-funksjonaliteten ved å gjøre IParser-implementeringene om til et array.

@Module({
    providers: [
        FirstParser,
        SecondParser,
        {
          provide: 'Parser',
          useFactory: (...parsers) => new ParserService(parsers),
          inject: [FirstParser, SecondParser],
        },
    ],
})
export class ParserServiceModule {}

Relaterte artikler