Installation
npm i --save nestjs-custom-injector
Links
https://nestjs-custom-injector.site15.ru/api/#/abstract-class - Demo application with nestjs-custom-injector.
https://github.com/EndyKaufman/nestjs-custom-injector/tree/develop/apps/demo/src/app/abstract-class - Example.
Usage
Create abstract class in animal.provider.ts
export abstract class AbstractAnimalProvider {
abstract type: string;
abstract say(): string;
}
Create first type of logic for cats in animal-cats.service.ts
import { Injectable } from '@nestjs/common';
import { AbstractAnimalProvider } from './animal.provider';
@Injectable()
export class AnimalCatsService extends AbstractAnimalProvider {
type = 'cat';
say(): string {
return 'meow';
}
}
Create second type of logic for dogs in animal-dogs.service.ts
import { Injectable } from '@nestjs/common';
import { AbstractAnimalProvider } from './animal.provider';
@Injectable()
export class AnimalDogsService extends AbstractAnimalProvider {
type = 'dog';
say(): string {
return 'woof';
}
}
Create controller animals.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
import { CustomInject } from 'nestjs-custom-injector';
import { AbstractAnimalProvider } from './animal.provider';
@Controller('animals')
export class AnimalsController {
@CustomInject(AbstractAnimalProvider, { multi: true })
private animalProviders!: AbstractAnimalProvider[];
@Get('animal-types')
animalTypes() {
return this.animalProviders.map((animalProvider) => animalProvider.type);
}
@Get('what-says-animals')
whatSaysAnimals() {
return this.animalProviders.map(
(animal) => `${animal.type} say ${animal.say()}`
);
}
@Get('who-say')
whoSay(@Query('voice') voice: string) {
const animal = this.animalProviders.find(
(animal) => animal.say() === voice
);
if (!animal) {
return { error: `I don't know who say ${voice}` };
}
return `${animal.type} say ${animal.say()}`;
}
}
Append all logic to main app module app.module.ts
import { Module } from '@nestjs/common';
import { CustomInjectorModule } from 'nestjs-custom-injector';
import { AnimalCatsService } from './animal-cats.service';
import { AnimalDogsService } from './animal-dogs.service';
import { AnimalsController } from './animals.controller';
import { AbstractAnimalProvider } from './animal.provider';
@Module({
...
imports: [
...
CustomInjectorModule.forRoot(),
CustomInjectorModule.forFeature({
providers: [{ provide: AbstractAnimalProvider, useClass: AnimalCatsService }],
}),
CustomInjectorModule.forFeature({
providers: [
{ provide: AbstractAnimalProvider, useValue: new AnimalDogsService() },
],
}),
...
],
controllers: [
...
AnimalsController
...
]
...
})
export class AppModule {}
Top comments (0)