Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/endykaufman/nestjs-custom-injector
Custom injecting logic for NestJS with support multi providing
https://github.com/endykaufman/nestjs-custom-injector
custom decorators global inject injector multi nestjs providers
Last synced: 3 months ago
JSON representation
Custom injecting logic for NestJS with support multi providing
- Host: GitHub
- URL: https://github.com/endykaufman/nestjs-custom-injector
- Owner: EndyKaufman
- Created: 2022-02-22T05:15:47.000Z (almost 3 years ago)
- Default Branch: develop
- Last Pushed: 2022-09-14T13:39:34.000Z (over 2 years ago)
- Last Synced: 2024-04-29T10:47:21.795Z (9 months ago)
- Topics: custom, decorators, global, inject, injector, multi, nestjs, providers
- Language: TypeScript
- Homepage: http://nestjs-custom-injector.site15.ru/api
- Size: 1.38 MB
- Stars: 10
- Watchers: 2
- Forks: 0
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
README
# nestjs-custom-injector
[![npm version](https://badge.fury.io/js/nestjs-custom-injector.svg)](https://badge.fury.io/js/nestjs-custom-injector)
[![monthly downloads](https://badgen.net/npm/dm/nestjs-custom-injector)](https://www.npmjs.com/package/nestjs-custom-injector)## Installation
```bash
npm i --save nestjs-custom-injector
```## Links
https://nestjs-custom-injector.site15.ru/api - Demo application with nestjs-custom-injector.
https://github.com/EndyKaufman/nestjs-custom-injector-example - Example generated with nest cli for "Usage" sections in readme.## Usage
Create common interface with token in **animal-provider.interface.ts**
```typescript
export const ANIMAL_PROVIDER = 'ANIMAL_PROVIDER';export interface AnimalProviderInteface {
type: string;
say(): string;
}
```Create first type of logic for cats in **animal-cats.service.ts**
```typescript
import { Injectable } from '@nestjs/common';
import { AnimalProviderInteface } from './animal-provider.interface';@Injectable()
export class AnimalCatsService implements AnimalProviderInteface {
type = 'cat';
say(): string {
return 'meow';
}
}
```Create second type of logic for dogs in **animal-dogs.service.ts**
```typescript
import { Injectable } from '@nestjs/common';
import { AnimalProviderInteface } from './animal-provider.interface';@Injectable()
export class AnimalDogsService implements AnimalProviderInteface {
type = 'dog';
say(): string {
return 'woof';
}
}
```Create controller **animals.controller.ts**
```typescript
import { Controller, Get, Query } from '@nestjs/common';
import { CustomInject } from 'nestjs-custom-injector';
import {
AnimalProviderInteface,
ANIMAL_PROVIDER,
} from './animal-provider.interface';@Controller('animals')
export class AnimalsController {
@CustomInject(ANIMAL_PROVIDER, { multi: true })
private animalProviders!: AnimalProviderInteface[];@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**
```typescript
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';@Module({
...
imports: [
...
CustomInjectorModule.forRoot(),
CustomInjectorModule.forFeature({
providers: [{ provide: ANIMAL_PROVIDER, useClass: AnimalCatsService }],
}),
CustomInjectorModule.forFeature({
providers: [
{ provide: ANIMAL_PROVIDER, useValue: new AnimalDogsService() },
],
}),
...
],
controllers: [
...
AnimalsController
...
]
...
})
export class AppModule {}
```## License
MIT