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)