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.
