Skip to content

Framework-Adapter

InferDI-Adapter verbinden exakte Containertypen mit Framework-Lebenszyklen. HTTP-Adapter erstellen einen Request-Scope und stellen ihn am frameworküblichen Ort bereit. Der React-Adapter liefert typisierte Kontexte und kann einen clientseitig erstellten Kind-Scope verwalten.

Die Adapter verwalten den Lebenszyklus von Request-Scopes. Das Kernpaket bleibt ohne Abhängigkeiten und ergänzt weder Dekoratoren noch Controller-Suche, Handler-Parameterinjektion oder automatische Routenerkennung.

Pakete

PaketFrameworkScope-ZugriffNur Root
@inferdi/fastifyFastify v5request.dija
@inferdi/honoHono v4c.var.dinein
@inferdi/koaKoa v3ctx.state.dinein
@inferdi/expressExpress 5req.dinein
@inferdi/elysiaElysia v1context.dija
@inferdi/reactReact 19React-Kontextexterner Provider

React verwendet den Komponentenlebenszyklus. Ein externer Provider gibt seinen Container nie frei; ein verwalteter ScopeProvider erstellt den Kind-Scope nach dem Commit und gibt ihn immer frei. Siehe React-Adapter.

Gemeinsamer Lebenszyklusvertrag

Im Scope-Modus durchlaufen HTTP-Anfragen dieselben Schritte:

  1. Erstellen: Bei Anfragebeginn einen Scope vom Root ableiten (createScope, standardmäßig root.createScope()).
  2. Bereitstellen: Hono, Koa, Express und Elysia stellen den Scope vor dem Setup am nativen Ort bereit. Fastify veröffentlicht request.di nach erfolgreichem Setup; bei Setup-Fehlern erscheint der Scope nur vorübergehend für die Freigabehooks. Fehlerhandler erhalten dort keinen halb aufgebauten Scope.
  3. Einrichten: Optionales, auch asynchrones setupScope führt zusätzliche Initialisierung vor den Handlern aus.
  4. Verarbeiten: Routen- und Fehlerhandler lösen Services aus dem Scope auf.
  5. Freigeben: Am sicheren Abschluss des Framework-Lebenszyklus wird disposeScope ausgeführt, standardmäßig scope.dispose(), sofern die Verantwortung nicht übertragen wurde.

Gemeinsame Optionen

OptionStandardZweck
containererforderlichRoot; keine automatische Freigabe außer Fastifys optionalem disposeRootOnClose.
createScoperoot.createScope()Scope erstellen und deklarierte Anfrageeingaben übergeben; darf asynchron sein.
setupScopekeinerZusätzliche Initialisierung vor Handlern; darf asynchron sein.
disposeScopescope.dispose()Eigene synchrone oder asynchrone Freigabe.
autoDisposetruefalse oder ein Prädikat mit Ergebnis false überträgt die Freigabe an deinen Code.
onDisposeErroradapterspezifischFastify: request.log.error; Koa: ctx.app.emit('error'); andere: console.error.
skipInferdiDispose(...)Überträgt die Verantwortung für eine Anfrage, etwa bei Streaming oder Hintergrundarbeit.

Fehler und Ressourcenverantwortung

  • Bei Setup-Fehlern bleibt der ursprüngliche Fehler sichtbar. Der halb aufgebaute Scope wird freigegeben. Ein zusätzlicher Freigabefehler geht an onDisposeError oder den Standardempfänger und wird nicht mit dem Setup-Fehler aggregiert.
  • Fehlgeschlagene Requests werden weiterhin freigegeben. skipInferdiDispose unterdrückt nur die Freigabe erfolgreicher Antworten. Express ist die Ausnahme: Behandelte nachgelagerte Routenfehler sind für seine Callback-Middleware nicht erkennbar; der übersprungene Scope bleibt anwendungseigen.
  • autoDispose: false und skipInferdiDispose übertragen die Verantwortung. Dein Code muss den Scope an der passenden Framework-Grenze freigeben. Auch Fehlerpfade respektieren autoDispose: false.
  • Freigabefehler nach Erzeugung einer Antwort werden gemeldet und abgefangen. Die bereits gesendete Antwort kann durch einen späten Freigabefehler nicht beschädigt werden.

Wesentliche Unterschiede

AdapterUnterschied
FastifyFreigabe in onResponse, bei Abbruch in onRequestAbort; optionale Root-Freigabe durch disposeRootOnClose.
HonoFreigabe nach await next(); Streaming-Helfer können früher zurückkehren, daher benötigen Streaming-Routen oft skipInferdiDispose.
KoaWartet auf finish oder close der Node-Antwort; normale Stream-Bodies brauchen keinen Skip.
ExpressErkennt behandelte nachgelagerte Routenfehler nicht; fehlgeschlagene übersprungene Requests bleiben anwendungseigen.
ElysiaFreigabe hängt von onAfterResponse ab. Ohne diesen Hook kann der Adapter Scope-Ressourcen nicht freigeben.