Existe el siguiente código NestJS estándar:
import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() getHello(): string { return this.appService.getHello(); } }También está el código para la aplicación del módulo:
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ imports: [], controllers: [AppController], providers: [AppService], }) export class AppModule {}No entiendo cómo la aplicación entiende que el controlador de la aplicación espera obtener el servicio de la aplicación como primer argumento. Al principio pensé que la aplicación solo mira la matriz de proveedores y coloca todos los servicios de esta matriz en el constructor del controlador. Pero podría cambiar el código de esta manera:
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ imports: [], controllers: [AppController], providers: [AppService, NewService], }) export class AppModule {}Ahora puedo usar este NewService no solo en la clase AppController , sino también en la clase AppService . ¿Cómo sabe la aplicación que ahora podría usar NewService en la clase AppService ? Ahora no entiendo cómo podríamos hacerlo, porque TypeScript es solo azúcar de sintaxis y existe solo hasta que se realice la compilación y, como sé, la aplicación no pudo ver el tipo de argumento en AppService (por ejemplo , fileService: FileService ) y poner el servicio correcto como argumento cuando se creará AppService . Necesito detalles técnicos bajo la cubierta de este mecanismo, no solo casos de uso del tutorial oficial.
Al registrarlo en la matriz de proveedores, lo registra en el contenedor de Nest IoC.
Si revisa el código js compilado, encontrará algo como
WeatherHttpProvider = __decorate([ (0, common_1.Injectable)(), __param(1, (0, common_1.Inject)(weather_parser_1.WEATHER_PARSER)), __metadata("design:paramtypes", [axios_1.HttpService, Object]) ], WeatherHttpProvider);que en este caso le dice a WeatherHttpProvider sobre los parámetros de constructor inyectados. De esta manera, sabe qué clase del contenedor IoC usar.