Uno de los providers mas complicado de ententer pero bastante poderoso
De todos los providers este es el mas potente ya que incluye inyectar dependencias que usará para resolver el valor a retornar y es que en este podemos aplicar lógica lo cual lo hace útil en numerosos casos.
Aveces tenemos que retornar un recurso diferente cuando estamos en modo developer o en modo producción y es cuando debemos filtrar para poder retornar el provider para ese ambiente. Este es uno de los caso donde se debe implementar useFactory.
A diferencia de los anteriores este debe retornar un valor devuelto por la función useFactory en conjunto con su key y de ser necesario inyectar las dependencias que usaremos como parametro de la función.
La siguiente es una expresión minima del uso de useFactory donde no injectamos nada y solo retornamos un valor.
{
provide: 'TOKEN',
useFactory: () => {
// lógica de creación
return 'hola mundo';
},
}
El siguiente ejemplo es bastante usado en donde ya ponemos un poco de lógica y necesitamos inyectar un recurso para retornar el valor deseado. El inject recibe un array de tanto parámetros deses usar.
{
provide: 'TOKEN',
useFactory: (configService: ConfigService) => {
const url = configService.get('REDIS_URL');
return createClient({ url });
},
inject: [ConfigService],
}
Finalmente otro caso de uso donde la función aún no siendo tan complicada se nota el potencial y el porque ha sido credo este provider dinámico.
// redis.module.ts
import { Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { createClient, RedisClientType } from 'redis';
export const REDIS = Symbol('REDIS_CLIENT');
@Module({
providers: [
{
provide: REDIS,
useFactory: async (config: ConfigService): Promise<RedisClientType> => {
const url = config.get<string>('REDIS_URL');
const client = createClient({ url });
await client.connect();
return client;
},
inject: [ConfigService],
},
],
exports: [REDIS],
})
export class RedisModule {}
!siempre tener presente que para no repetir código una ves resuelta esta configuración puedes exportarla y de esta manera ser usada por otros módulos.