Some checks failed
CI / build-lint-test (pull_request) Failing after 29s
Registre de services en singleton avec injection par decorateurs :
- ServiceRepository : singleton central, uid genere automatiquement
(crypto.randomUUID) a l'enregistrement, une seule instance partagee
par service.
- @RegisterService() : decorateur de classe, instancie et enregistre
automatiquement la classe decoree (constructeur sans argument).
- @Service(target) : decorateur de propriete, injection paresseuse et
memoisee par reference de classe (resolution au premier acces, pas
a la decoration - insensible a l'ordre d'evaluation des modules).
Fix connexe dans tsconfig.base.json : useDefineForClassFields desactive
(target ES2022 l'active par defaut), sinon un champ de classe sans
initialiseur est reinitialise a undefined sur l'instance a la
construction et masque l'accesseur pose sur le prototype par un
decorateur de propriete - touche @Service ici et @LinkToDom dans
web-component. Documente dans spec/architecture.md.
Fix connexe dans scripts/create-package.mjs : execFileSync('pnpm', ...)
ne resout pas le shim .cmd de pnpm sous Windows sans shell: true
(trouve en re-testant le script sur ce package).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
49 lines
2.2 KiB
Markdown
49 lines
2.2 KiB
Markdown
# @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<T>`, `ServiceUid` — types associés.
|