# @lightweight-sdk/service-registry Registre de services en singleton, avec enregistrement et injection par décorateurs. Package `common` : isomorphe, aucune dépendance DOM ou Node-only. ## Installation ```bash pnpm add @lightweight-sdk/service-registry ``` ## Usage ```ts import { RegisterService, Service } from '@lightweight-sdk/service-registry'; @RegisterService() class LoggerService { public log(message: string): void { console.log(message); } } class ReportGenerator { @Service(LoggerService) private readonly logger!: LoggerService; public run(): void { this.logger.log('generating report'); } } ``` ## Concepts - **`ServiceRepository`** — singleton central qui stocke une instance unique de chaque service, indexée par un uid généré automatiquement (`crypto.randomUUID()`) à l'enregistrement. Accès direct rarement nécessaire : `RegisterService`/`Service` couvrent l'usage courant. - **`@RegisterService()`** — décorateur de classe. Instancie la classe décorée (constructeur sans argument obligatoire) et l'enregistre dans le `ServiceRepository`. - **`@Service(TargetClass)`** — décorateur de propriété. Injecte l'instance partagée de `TargetClass` dans le membre décoré. La résolution est **paresseuse** (au premier accès à la propriété, pas à la décoration) : peu importe que la classe consommatrice soit évaluée avant ou après l'enregistrement du service. Après le premier accès, la propriété est remplacée par la valeur résolue (pas de nouvelle recherche ensuite). ## Contraintes - Une classe décorée par `@RegisterService()` doit avoir un constructeur sans argument obligatoire — ses propres dépendances doivent elles-mêmes être injectées via `@Service`, pas passées au constructeur. - `experimentalDecorators: true` doit être activé côté consommateur (déjà le cas dans ce monorepo via `tsconfig.base.json`). ## API - `RegisterService()` — décorateur de classe. - `Service(target)` — décorateur de propriété. - `ServiceRepository` — singleton (`getInstance()`, `registerClass`, `resolveClass`, `resolve`, `getUidForClass`, `hasClass`). `resetForTesting()` est réservé aux tests. - `ServiceConstructor`, `ServiceUid` — types associés.