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