Skip to content

Fehler ​

InferDI meldet fehlerhafte Graphen- und Lebenszyklusoperationen ausdrücklich. Halte diese Meldungen in Tests sichtbar, damit Registrierungsfehler früh auffallen.

AuslöserMeldung
.get(k) mit unbekanntem SchlüsselKey "k" not found
Auflösung auf freigegebenem ContainerContainer is disposed (key: "k")
Auflösung über freigegebenen VorfahrenAncestor container is disposed (key: "k")
createScope() nach FreigabeCannot create scope from a disposed container
Registrierung nach FreigabeCannot register on a disposed container (key: "k")
Scoped Auflösung aus dem Root bei fast: falseScoped "k" cannot be resolved from the root container. Use createScope().
Lebensdauerverletzung eines SingletonsSingleton "x" cannot depend on scoped "y"...
Synchroner ZyklusCircular dependency detected: a -> b -> a...
Synchrone Freigabe asynchroner RessourceSync [Symbol.dispose] called on a resource whose .dispose() returned a Promise...
Synchrone Freigabe gecachter asynchroner InitialisierungSync [Symbol.dispose] called on a container that cached a Promise from an async factory...
Zu spätes OverrideCannot override "k" because it has already been resolved...
Override auf freigegebenem ContainerCannot override on a disposed container (key: "k")

Vor dem Melden eines synchronen Freigabefehlers beobachtet InferDI die Ablehnung eines gecachten nativen Promise. Eine spätere Ablehnung führt dadurch nicht zu unhandledRejection; die synchrone Freigabe kann die Ressource trotzdem weder abwarten noch schließen. Bei eigenen Promise-ähnlichen Werten wird .then() nicht aufgerufen.

Bei asynchroner Freigabe können eine fehlgeschlagene Abhängigkeit und ihre Verbraucher mit demselben Error-Objekt ablehnen. InferDI meldet dieses Objekt einmal. Separate Fehlerobjekte bleiben separate Ursachen im AggregateError, auch bei identischen Meldungen.

Zyklen in asynchronen Factories ​

Deklarative Kanten in registerAsyncFactory(..., deps, ...) werden synchron vorgeprüft. Die bestehende Zykluserkennung weist Zyklen zurück, bevor ein Factory-Rumpf startet.

Zyklen nach einer Promise-Grenze werden nicht erkannt. Dazu zählen Zugriffe aus Promise-wertigen registerFactory-Callbacks und über erfasste Container nach await. Warten beide Seiten aufeinander, bleibt das Promise dauerhaft ausstehend.

Behebe asynchrone Zyklen in der Architektur:

  • gemeinsame Initialisierung abtrennen
  • eine Seite in einen früher initialisierten Service verlagern
  • Lazy<singleton> nur für synchrone Singleton-Kanten verwenden
  • verdächtige oberste await-Aufrufe während der Entwicklung mit einem Timeout überwachen

Freigabefehler in Adaptern ​

Nach Erzeugung einer Antwort werden Freigabefehler nie an den Client weitergereicht. Sie gehen an onDisposeError oder den Standardempfänger des Adapters.

Setup-Fehler sind anders: Der ursprüngliche Fehler wird weitergereicht. Ein zusätzlicher Fehler bei der Freigabe während des Setup-Abbruchs wird separat gemeldet und nicht mit dem sichtbaren Fehler aggregiert.