@chubbyts/chubbyts-dic-config-factory
v1.0.0
Published
An abstract service factory for the dependency injection container, usable with chubbyts-dic-config, inspired by chubbyphp-laminas-config-factory.
Maintainers
Readme
chubbyts-dic-config-factory
Description
An abstract service factory for the dependency injection container, usable with @chubbyts/chubbyts-dic-config, inspired by chubbyphp-laminas-config-factory.
It reduces the boilerplate within config based service factories:
resolveConfig: resolves the (named) config of the current serviceresolveDependency: resolves a dependency via the container if present, or creates it via the given abstract factoryresolveValue: resolves a value, replacing strings (recursively within arrays / objects) by matching services
Requirements
- node: 22
- @chubbyts/chubbyts-dic-types: ^2.3.0
Installation
Through NPM as @chubbyts/chubbyts-dic-config-factory.
npm i @chubbyts/chubbyts-dic-config-factory@^1.0.0Usage
Factory
import { createAbstractFactory } from '@chubbyts/chubbyts-dic-config-factory/dist/dic-config-factory';
import { ServiceA } from '../service/service-a';
import type { Config } from '../config';
import { serviceBFactory } from './service-b-factory';
export const serviceAFactory = createAbstractFactory((container, { resolveConfig, resolveDependency }): ServiceA => {
return new ServiceA(
resolveConfig(container.get<Config>('config').serviceA ?? {}),
resolveDependency(container, 'serviceB', serviceBFactory),
);
});With @chubbyts/chubbyts-dic-config
import { createContainerByConfigFactory } from '@chubbyts/chubbyts-dic-config/dist/dic-config';
import type { ServiceA } from './service/service-a';
import { serviceAFactory } from './factory/service-a-factory';
import { serviceBFactory } from './factory/service-b-factory';
const containerByConfigFactory = createContainerByConfigFactory({
serviceA: { key: 'value' },
serviceB: { key2: 'value2' },
dependencies: {
factories: new Map([
['serviceA', serviceAFactory()],
['serviceB', serviceBFactory()],
]),
},
});
const container = containerByConfigFactory();
const serviceA = container.get<ServiceA>('serviceA');With names
The same abstract factory can be reused for multiple services of the same kind, for example a read and a write
database connection. The given name resolves the related sub config (resolveConfig) and gets appended to the id of
each dependency (resolveDependency).
import { createContainerByConfigFactory } from '@chubbyts/chubbyts-dic-config/dist/dic-config';
import type { ServiceA } from './service/service-a';
import { serviceAFactory } from './factory/service-a-factory';
import { serviceBFactory } from './factory/service-b-factory';
const containerByConfigFactory = createContainerByConfigFactory({
serviceA: { read: { key: 'valueRead' }, write: { key: 'valueWrite' } },
serviceB: { read: { key2: 'value2Read' }, write: { key2: 'value2Write' } },
dependencies: {
factories: new Map([
['serviceAread', serviceAFactory('read')],
['serviceAwrite', serviceAFactory('write')],
['serviceBread', serviceBFactory('read')],
['serviceBwrite', serviceBFactory('write')],
]),
},
});
const container = containerByConfigFactory();
const serviceARead = container.get<ServiceA>('serviceAread');
const serviceAWrite = container.get<ServiceA>('serviceAwrite');Copyright
2026 Dominik Zogg
