andy-stack_vaultkeeper-ai/Services/DependencyService.ts

49 lines
1.3 KiB
TypeScript
Raw Permalink Normal View History

import { Exception } from "Helpers/Exception";
import type { Component } from "obsidian";
const services = new Map<symbol, unknown>();
2025-09-08 14:50:06 +00:00
export function RegisterSingleton<T>(type: symbol, instance: T) {
2025-09-08 14:50:06 +00:00
services.set(type, instance);
}
export function RegisterTransient<T>(type: symbol, factory: () => T) {
2025-09-08 14:50:06 +00:00
services.set(type, factory);
}
export function Resolve<T>(type: symbol): T {
const service = services.get(type);
2025-09-08 14:50:06 +00:00
if (!service) {
Exception.throw(`Service not found for type: ${type.description}`);
2025-09-08 14:50:06 +00:00
}
if (typeof service === "function") {
// It"s a transient factory, return a new instance
return (service as () => T)();
2025-09-08 14:50:06 +00:00
}
// It"s a singleton, return the existing instance
2025-09-08 14:50:06 +00:00
return service as T;
}
export function TryResolve<T>(type: symbol): T | undefined {
if (services.has(type)) {
return Resolve<T>(type);
}
}
export function DeregisterAllServices() {
services.forEach((service) => {
if (!service || typeof service !== "object") {
return;
}
if ("dispose" in service && typeof service.dispose === "function") {
(service as { dispose: () => void }).dispose();
}
if ("unload" in service) {
(service as Component).unload();
}
});
services.clear();
2025-09-08 14:50:06 +00:00
}