Working on NestJS app and faced situation I cannot find answer in docs.
I have set of services, Kafka connection and base consumer implementation. Consumer implemented as
export abstract class KafkaConsumerBaseService<
TParsedMessage extends KafkaMessage,
> implements OnModuleInit {
protected readonly redisService: RedisService;
protected readonly kafkaService!: KafkaService;
protected readonly logger!: CustomeLogger;
constructor(topic: KafkaTopicType, cls: Constructable<TParsedMessage>) {
this.topic = topic;
this.cls = cls
}
}
where cls
is actually a DTO to validate Kafka message. And as it is implemented in OOp approach I have to inject (they are all injectable) RedisService
, KafkaService
and CustomerLogger
in children, who inherits this base consumer service and, mot important – implemets process
method that called once message validated. One app can have multiple consumers (for instance one has 8), so I implement it like
export class Consumer1 extends KafkaConsumerBaseService<DTO_1> {
protected readonly logger: CustomLogger = new CustomLogger(
Consumer1.name,
);
constructor (
protected readonly consumer1Service Consumer1Service,
protected readonly kafkaService: KafkaService,
protected readonly redisService: RedisService,
) {
super('topic1', DTO_1);
}
}
export class Consumer2 extends KafkaConsumerBaseService<DTO_2> {
protected readonly logger: CustomLogger = new CustomLogger(
Consumer2.name,
);
constructor (
protected readonly consumer1Service Consumer2Service,
protected readonly kafkaService: KafkaService,
protected readonly redisService: RedisService,
) {
super('topic2', DTO_2);
}
}
export class Consumer3 extends KafkaConsumerBaseService<DTO_3> {
protected readonly logger: CustomLogger = new CustomLogger(
Consumer3.name,
);
constructor (
protected readonly consumer3Service Consumer3Service,
protected readonly kafkaService: KafkaService,
protected readonly redisService: RedisService,
) {
super('topic3', DTO_3);
}
}
....
After all all these consumers are imported in the app.module
.
I’d like to get rid of injecting logger (but it actually depends on specific service name) and RedisService
+ KafkaService
. At least latter 2.
But how to inject different params and instantiate services without using it in another servicesm just to provide and use?