Imagen de un simpatico robot azul con un letrero en frente lavour

Comienza a listar tus providers como un pro

Una de las cualidades de nest es la manera como organiza el código, como si estuviera creado, o lo es para que implemente buenas practicas y DDD desde su concepción y parte de esto es como lista los providers del controller, esto no solo ayuda a organizar el código, hace que podamos pensar en como escribir código de manera eficiente.

La manera mas sencilla de ver como nest lista el provider que vamos a usar en la clase es: provider:[userClass], hasta aquí todo bien ya que la manera más sencilla de explicar lo que esta haciendo es decirle al controller que en runTime va a instanciar una clase llamada useClass la cual puedes llamar en el constructor.

providers: [
 {
  provide: UsersService, // token
  useClass: UsersService, // clase
 },
]

Al hacer esto ahora aumentamos las opciones de como implementamos un provider ya que le hemos asignado un token para llamarlo. 

constructor(private readonly usersService: UsersService) {}

Hasta aquí, no estamos haciendo nada nuevo incluso colocar un token con el mismo nombre de la clase es contraproducente ya que haríamos lo mismo si: providers: [userService] ya que si el nombre de la clase es el mismo ya nest reconoce que clase va a instancear. 

Ahora pongamos un ejemplo en donde estas necesitando usar userServide con una clase que llama datos desde SQL y otra que llama datos desde MONGO, igual querías llamar a que instancie userService. 

providers: [
  {
    provide: UsersService,
    useClass: UsersServiceFromSQL,
  },
]

...luego tenemos la posibilidad de cambiar la clase. 

providers: [
  {
    provide: UsersService,
    useClass: UsersServiceFromMongo,
  },
]

...para el controlador es muy fácil entonces reconocer el tipo de clase que va usar ya que con el token nest ha instanceado la clase correcta. 

constructor(
  @Inject('userService') // mejor si está en upper USER_SERVICE
  private readonly usersService: UsersServiceFromMongo,
) {}

Ahora que tenemos instanceada podemos llamar a userService como el la variable le ha llamado pero la clase seleccionada es el servicio que conecta con Mongo. 

Ahora, pasamos a ejecutar este nuevo conocimiento como un pro: 

@Module({
providers: [
  {
      provide: UsersService,
      useClass:
          process.env.NODE_ENV === 'production'
          ?  usersServiceFromSQL
          : userServiceFromMONGO,
     },
   ],
})

Esta es una manera de automatizar una tarea y demuestra que dominas los tokens para instancear clases como provider en nest, ya que haciendo esto podemos trabajar en locar o producción sabiendo que usaremos la instancia correcta.