Skip to content

Minimal Todo Example

repositories/ITodoRepository.ts
export interface ITodoRepository {
create(todo: Todo): Promise<Todo>;
findById(id: string): Promise<Todo | undefined>;
findAll(): Promise<Todo[]>;
}
// repositories/InMemoryTodoRepository.ts
export class InMemoryTodoRepository implements ITodoRepository {
private todos: Todo[] = [];
async create(todo: Todo) { /* ... */ }
async findById(id: string) { /* ... */ }
async findAll() { /* ... */ }
}
// services/ITodoService.ts
export interface ITodoService {
createTodo(data: CreateTodoData): Promise<Todo>;
getAllTodos(): Promise<Todo[]>;
getTodoById(id: string): Promise<Todo | undefined>;
}
// services/TodoService.ts
export class TodoService implements ITodoService {
constructor(private todoRepository: ITodoRepository) {}
async createTodo(data: CreateTodoData) { /* ... */ }
async getAllTodos() { /* ... */ }
async getTodoById(id: string) { /* ... */ }
}
Terminal window
npx @notjustcoders/ioc-arise generate

container.gen.d.ts:

export interface ContainerRegistry {
'ITodoService': ITodoService;
'ITodoRepository': ITodoRepository;
}

container.gen.ts:

import { Container, Lifecycle } from '@notjustcoders/di-container';
import type { ContainerRegistry } from './container.gen.d';
import { TodoService } from './services/TodoService';
import { InMemoryTodoRepository } from './repositories/InMemoryTodoRepository';
export const container = new Container<ContainerRegistry>();
container.register('ITodoRepository', {
useClass: InMemoryTodoRepository,
lifecycle: Lifecycle.Singleton
});
container.register('ITodoService', {
useClass: TodoService,
dependencies: ['ITodoRepository'],
lifecycle: Lifecycle.Singleton
});
import { container } from './container.gen';
const todoService = container.resolve('ITodoService');
// ^? ITodoService - Full type safety!
await todoService.createTodo({
title: 'Learn IoC Arise',
description: 'Study dependency injection'
});
const todos = await todoService.getAllTodos();