|
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>
|
||
|---|---|---|
| .. | ||
| src | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
@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
pnpm add @lightweight-sdk/service-registry
Usage
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/Servicecouvrent l'usage courant.@RegisterService()— décorateur de classe. Instancie la classe décorée (constructeur sans argument obligatoire) et l'enregistre dans leServiceRepository.@Service(TargetClass)— décorateur de propriété. Injecte l'instance partagée deTargetClassdans 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: truedoit être activé côté consommateur (déjà le cas dans ce monorepo viatsconfig.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.