Skip to content

フレームワークアダプター

InferDI アダプターは正確なコンテナー型をフレームワーク lifecycle に接続します。HTTP アダプターは request scope を 1 つ作成してフレームワーク固有の場所に公開します。React アダプターは型付き context を提供し、クライアントで作る子 scope も所有できます。

これがアダプターの仕事のすべてです。アダプターは薄いライフサイクルのグルーです。@inferdi/inferdi をゼロ依存に保つのと同じ設計が、デコレーター、コントローラースキャン、ハンドラーパラメータ注入、ルート探索をコアから排除し続けています。あなたが選ぶのはフレームワークのリクエストライフサイクルであって、フレームワーク独自の依存性注入の考え方ではありません。

パッケージ

パッケージフレームワークスコープの場所ルート専用モード
@inferdi/fastifyFastify v5request.diあり
@inferdi/honoHono v4c.var.diなし
@inferdi/koaKoa v3ctx.state.diなし
@inferdi/expressExpress 5req.diなし
@inferdi/elysiaElysia v1context.diあり
@inferdi/reactReact 19React context外部 Provider

React は以下の request lifecycle ではなく、コンポーネント lifecycle を使います。外部 Provider はコンテナーを dispose せず、managed ScopeProvider は commit 後に子 scope を作成して必ず dispose します。詳しくは React アダプター を参照してください。

共通のライフサイクル契約

スコープドモードでは、すべてのアダプターが各リクエストに対して同じステップを実行します。

  1. リクエストが開始されると、ルートコンテナからスコープを 作成 します(createScope、デフォルトは root.createScope())。
  2. フレームワークネイティブの場所でスコープを 公開 します。Hono、Koa、Express、Elysia はセットアップ前に公開します。Fastify はセットアップ成功後に request.di を公開し、セットアップ失敗時のクリーンアップ中だけ一時的に公開します。クリーンアップフックは公開スロットを参照できますが、エラーハンドラーには構築途中のスコープを渡しません。
  3. ハンドラー実行前に追加の初期化が必要なら、setupScope でスコープを セットアップ します。非同期でもかまいません。
  4. リクエストを 処理 します。ルートハンドラーとフレームワークのエラーハンドラーが、公開されたスコープからサービスを解決します。
  5. 所有権が移譲されていない限り、フレームワークの安全な完了ポイントでスコープを 破棄 します(disposeScope、デフォルトは scope.dispose())。

共通オプション

オプションデフォルト目的
container必須アプリに公開されるルートコンテナ。アダプターはこれを破棄しません(Fastify のオプトインの disposeRootOnClose を除く)。
createScoperoot.createScope()リクエストスコープを構築し、宣言済みの入力をここで渡します。非同期でもかまいません。
setupScopeなしハンドラー実行前に追加の初期化を行います。非同期でもかまいません。
disposeScopescope.dispose()カスタムのクリーンアップ。同期でも非同期でもかまいません。
autoDisposetruefalse、または false を返す述語を指定すると、破棄をあなたのコードに委ねます。
onDisposeErrorアダプターごとのシンクリクエストスコープの破棄失敗を受け取ります。Fastify は request.log.error、Koa は ctx.app.emit('error')、その他は console.error
skipInferdiDispose(...)ストリーミングやバックグラウンド作業のために、1 つのリクエストをアプリケーション所有としてマークします。

エラーと所有権のルール

  • セットアップの失敗は元のエラーのみを表面化します。 setupScope がスローした場合、アダプターは構築途中のスコープを破棄し、そのエラーを再送出します。このクリーンアップ中のクリーンアップ失敗は onDisposeError(またはシンク)に送られ、表面化されるエラーに集約されることはありません。
  • 失敗したリクエストもスコープを破棄します。 skipInferdiDispose成功した レスポンスでのみクリーンアップを抑制します。エラーパスでは、それに関係なくスコープを破棄します。Express は例外です。コールバックミドルウェアは処理済みのルートエラーを観測できないため、スキップされた失敗した Express リクエストはアプリケーション所有のままになります。
  • autoDispose: falseskipInferdiDispose は所有権を移譲します。 その後は、あなたのコードが正しいフレームワークの境界でスコープを破棄する責任を負います。
  • レスポンスが生成された後のクリーンアップエラーはシンクにルーティングされ、握りつぶされます。 レスポンスはすでに送信されているため、遅れたクリーンアップ失敗がそれを破損させることは決してありません。

重要な違い

アダプター違い
FastifyonResponse で破棄します。中断時のクリーンアップは onRequestAbort を使用します。ルートの破棄は disposeRootOnClose でオプトインできます。
Honoawait next() の後に破棄します。ストリーミングヘルパーはストリーム作業が終わる前に戻ることがあるため、ストリーミングルートではしばしば skipInferdiDispose が必要です。
KoaNode レスポンスの finish または close を待つため、通常のストリームボディにはスキップは不要です。
Expressコールバックミドルウェアから処理済みのダウンストリームのルートエラーを検出できません。スキップされた失敗したリクエストはアプリケーション所有のままになります。
Elysiaクリーンアップは onAfterResponse にバインドされています。そのフックに到達しなかった場合、スコープが保持するリソースはアダプターによって解放できません。