Skip to Content
DocsClaDICore ConceptsFactory Providers

Factory Providers

Factory behavior in ClaDI is expressed through provider factories.

Why Factory Providers

  • Centralize construction logic for complex services.
  • Keep creation details out of domain/application layers.
  • Compose dependencies via typed tokens.
  • Apply lifecycle semantics (singleton, scoped, transient) consistently.

Basic Pattern

src/factory-provider.ts
container.register({ provide: UserServiceToken, deps: [RepoToken, ClockToken], lifecycle: EDependencyLifecycle.SINGLETON, useFactory: (repo, clock) => new UserService(repo, clock), });

Lifecycle-Aware Factory Pattern

src/factory-provider-lifecycle.ts
container.register({ provide: PaymentGatewayToken, deps: [ConfigToken, LoggerToken], onInit: (gateway) => gateway.warmup?.(), afterResolve: (gateway) => gateway.markUsage?.(), onDispose: async (gateway) => { await gateway.close?.(); }, useFactory: (config, logger) => createGateway(config, logger), });

Multi-Binding Factory Pattern

Use multi-binding when multiple implementations contribute to one contract:

src/factory-provider-multibinding.ts
container.register({ provide: MiddlewareToken, isMultiBinding: true, useFactory: () => createAuthMiddleware(), }); container.register({ provide: MiddlewareToken, isMultiBinding: true, useFactory: () => createMetricsMiddleware(), }); const middlewares = container.resolveAll(MiddlewareToken);
Last updated on