Skip to content

Factory Functions

Separate Parameters Pattern:

/**
* @factory
*/
function createUserUseCase(userRepo: IUserRepository) {
return (userId: string): string => {
return userRepo.getUser(userId);
};
}

Context Object Pattern:

/**
* @factory
*/
function createTodoUseCase(
context: { userRepo: IUserRepository, todoRepo: ITodoRepository }
) {
return (userId: string, title: string): void => {
const user = context.userRepo.getUser(userId);
context.todoRepo.saveTodo(title);
};
}
Terminal window
npx @notjustcoders/ioc-arise generate

container.gen.d.ts:

export interface ContainerRegistry {
'createUserUseCase': ReturnType<typeof createUserUseCase>;
'createTodoUseCase': ReturnType<typeof createTodoUseCase>;
}

container.gen.ts:

import { Container, Lifecycle } from '@notjustcoders/di-container';
import type { ContainerRegistry } from './container.gen.d';
import { createUserUseCase } from './factories/userUseCaseFactory';
import { createTodoUseCase } from './factories/todoUseCaseFactory';
export const container = new Container<ContainerRegistry>();
container.register('createUserUseCase', {
useFactory: createUserUseCase,
dependencies: ['IUserRepository'],
lifecycle: Lifecycle.Singleton
});
container.register('createTodoUseCase', {
useFactory: (userRepo, todoRepo) => createTodoUseCase({ userRepo, todoRepo }),
dependencies: ['IUserRepository', 'ITodoRepository'],
lifecycle: Lifecycle.Singleton
});
import { container } from './container.gen';
const createUser = container.resolve('createUserUseCase');
const createTodo = container.resolve('createTodoUseCase');
createUser('user-1');
createTodo('user-1', 'Buy groceries');