If in some reason you need to define factories separatelly from the container declaration, you can just declare factories object of type IFactories<IContainer>.
Example 1. Declaring Factories Object
./factories.ts
import { IFactories } from 'true-di';
import { IContainer } from './interfaces';
import Logger from './Logger';
import DataSourceService from './DataSourceService';
import ECommerceService from './ECommerceService';
const factories: IFactories<IContainer> = {
logger: () =>
new Logger(),
dataSourceService: ({ logger }) =>
new DataSourceService(logger),
ecommerceService: ({ logger, dataSourceService }) =>
new ECommerceService(logger, dataSourceService),
};
export default factories;
then we can use this factories object to create a container:
./index.js
import express from 'express';
import diContainer from 'true-di';
import factories from './factories';
import { getOrders } from './controller';
const app = express();
app.use((req, res, next) => {
req.container = diContainer(factories);
next();
});
app.get('/orders', getOrders);
app.listen(8080);
Example 2. Partial Factories Object
You can define several factories objects those could be marged on the container creation stage.
./factories.ts
import { IFactories } from 'true-di';
import { IContainer } from './interfaces';
import Logger from './Logger';
import DataSourceService from './DataSourceService';
import ECommerceService from './ECommerceService';
type FactoryFor<Names extends keyof IContainer> = Pick<IFactories<IContainer>, Names>;
export const loggerFactory: FactoryFor<'logger'> = {
logger: () => new Logger(),
};
export const dasFactory: FactoryFor<'dataSourceService'> = {
dataSourceService: ({ logger }) => new DataSourceService(logger),
};
export const ecommerceServiceFactory: FactoryFor<'ecommerceService'> = {
ecommerceService: ({ logger, dataSourceService }) =>
new ECommerceService(logger, dataSourceService),
};