type Provider = (manager: DependencyManager) => Promise | T; type ClassType = new () => T; // deno-lint-ignore no-explicit-any type ModuleIdentifier = any; type Modules = Map; // deno-lint-ignore no-explicit-any instance?: any; }>; export class DependencyManager { private modules: Modules = new Map(); private resolving: Set = new Set(); // Enregistrer un module avec son initialisateur register(identifier: ModuleIdentifier, provider: Provider): void { if (this.modules.has(identifier)) { throw new Error(`Module ${identifier} is already registered.`); } this.modules.set(identifier, { provider }); } // Résoudre un module et ses dépendances async resolve(identifier: ClassType): Promise; async resolve(identifier: ModuleIdentifier): Promise; async resolve(identifier: ModuleIdentifier) { const module = this.modules.get(identifier); if (!module) { throw new Error(`Module ${identifier} is not registered.`); } if (module.instance) { return module.instance; } if (this.resolving.has(identifier)) { throw new Error(`Circular dependency detected for module ${identifier}.`); } this.resolving.add(identifier); try { module.instance = await module.provider(this); return module.instance; } finally { this.resolving.delete(identifier); } } }