
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.