node.js - Vad är Injectable i NestJS?


Jag studerar NestJS, här är min enkla tjänst:

import { Injectable } from '@nestjs/common';

const userMock = [{ account: 'dung', password: '12345678' }];

@Injectable()
export class UserService {
  getUser() {
    return userMock
  }
}

Jag förstår inte riktigt @Injectable i NestJS. Några handledningar säger att @Injectable låter @Controller veta att det är installerat och kan användas som ett beroendeinjektion. Men när jag tar bort det fungerar det fortfarande.

Vänligen ge ett exempel på skillnaden mellan @Injectable och utan @Injectable

Svar #1

@Injectable() är hur du talar om för Nest att detta är en klass som kan ha beroenden som ska instansieras av Nest och dess DI-system. Koden du postade fungerar eftersom det inte finns några injicerade beroenden. Om du istället hade

const userMock = [{ account: 'dung', password: '12345678' }];

export class UserService {
  constructor(private readonly otherService: OtherService) {}
  getUser() {
    return userMock
  }
}

OtherService skulle återvända undefined på grund av att UserService inte är @Injectable()

Svar #2

@Injectable() annoteringen tillåter dig att injicera instanser.

Självklart bör den instansen ha en @Injectible()-annotering.

Låt mig visa dig ett exempel.

@Injectable()
export class PersonService {
  getName() {
    return 'ninezero90hy';
  }
}
@Injectable()
export class AppService {
  constructor(private readonly personService: PersonService) {
    Logger.log(this.personService.getName())
  }
}

print 'ninezero90hy'

--

Om det inte finns någon AppService- eller PersonService-@Injectible()-annotering uppstår ett fel.

--

Använder @Injectible()-annoteringen

Du kan definiera injektionsområdet.

Detta betyder att NestJS-behållaren skapar en instans.

--

Referens:

export declare enum Scope {
    /**
     * The provider can be shared across multiple classes. The provider lifetime
     * is strictly tied to the application lifecycle. Once the application has
     * bootstrapped, all providers have been instantiated.
     */
    DEFAULT = 0,
    /**
     * A new private instance of the provider is instantiated for every use
     */
    TRANSIENT = 1,
    /**
     * A new instance is instantiated for each request processing pipeline
     */
    REQUEST = 2
}

Om du inte använder @Injectible()-annoteringar, hanterar inte NestJS instanser, så ett fel kommer att uppstå i DI-processen.

Relaterade artiklar