Factory Functions
Step 1: Write Your Code
Section titled “Step 1: Write Your Code”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); };}Step 2: Generate Container
Section titled “Step 2: Generate Container”npx @notjustcoders/ioc-arise generateStep 3: Generated Code
Section titled “Step 3: Generated Code”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});Step 4: Use It
Section titled “Step 4: Use It”import { container } from './container.gen';
const createUser = container.resolve('createUserUseCase');const createTodo = container.resolve('createTodoUseCase');
createUser('user-1');createTodo('user-1', 'Buy groceries');