Skip to content

Referencia: Inyección de Dependencias

Wabot usa tsyringe como contenedor DI. Las exportaciones relevantes vienen de @wabot-dev/framework.

import { singleton, injectable, scoped, Lifecycle, container } from '@wabot-dev/framework'

Decoradores de ciclo de vida

@singleton()

Una única instancia compartida en toda la aplicación. Ideal para servicios con estado global, repositorios y configuración.

@singleton()
export class AppConfig {
readonly apiKey = process.env.API_KEY!
}

@injectable()

Nueva instancia cada vez que se resuelve. Ideal para servicios sin estado o que deben ser independientes entre llamadas.

@injectable()
export class PriceCalculator {
calculate(price: number, qty: number): number {
return price * qty
}
}

@scoped(Lifecycle.ContainerScoped)

Una instancia por contenedor hijo. El framework crea contenedores hijo automáticamente por request HTTP, por conexión Socket y por chat. Úsalo para servicios con estado aislado por request.

import { scoped, Lifecycle } from '@wabot-dev/framework'
@scoped(Lifecycle.ContainerScoped)
export class RequestContext {
userId?: string
}

Resolución automática

Cualquier clase decorada con @singleton(), @injectable() o @scoped() se resuelve automáticamente cuando aparece en el constructor de otra clase inyectable.

@singleton()
export class NotificacionService {
constructor(
private email: EmailService, // resuelto automáticamente
private config: AppConfig, // resuelto automáticamente
) {}
}

No es necesario registrar manualmente los servicios — basta con que estén decorados.


container

Instancia global del contenedor DI. Úsala para resoluciones manuales o para registrar implementaciones.

container.resolve(Clase)

Resuelve una dependencia manualmente. Útil en el entry point de la aplicación.

import { container } from '@wabot-dev/framework'
const config = container.resolve(AppConfig)

container.registerType(Abstracto, Concreto)

Registra una implementación concreta para una clase/interfaz abstracta. Se usa para elegir implementaciones en tiempo de arranque.

import { container, ChatAdapter, WabotChatAdapter } from '@wabot-dev/framework'
container.registerType(ChatAdapter, WabotChatAdapter)

container.registerInstance(Clase, instancia)

Registra una instancia ya construida como singleton.

import { Pool } from 'pg'
container.registerInstance(Pool, new Pool({ connectionString: process.env.DATABASE_URL }))

Inyección especial: @chatBot(MindsetClass)

Decorador de parámetro de constructor disponible dentro de @chatController(). Inyecta un ChatBot configurado con el mindset indicado.

import { chatBot, ChatBot } from '@wabot-dev/framework'
@chatController()
export class MiController {
constructor(
@chatBot(MiMindset) private bot: ChatBot,
) {}
}

Decoradores registrados implícitamente

Estos decoradores aplican @injectable() o @singleton() internamente — no necesitas decorar la clase manualmente:

DecoradorLifecycle aplicado
@mindset()@injectable()
@mindsetModule()@injectable()
@chatController()@injectable()
@restController()@injectable()
@socketController()@injectable()
@commandHandler()@injectable()
@cronHandler()@singleton()
@pgJsonRepository()@singleton()