メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://docs.wyrly.dev/llms.txt

Use this file to discover all available pages before exploring further.

ライフタイムは、解決されたインスタンスがどれだけ長く生きるかを定義します。 適切なライフタイムを選ぶことで、状態の所有関係が明確になり、リクエスト固有の依存関係がユーザーやリクエストをまたいで漏れることを防げます。

Singleton

singleton はステートレスなサービスや、プロセス全体で共有する依存関係に使います。
container.register(LoggerToken, {
  useClass: ConsoleLogger,
  lifetime: "singleton",
});
よい候補:
  • loggers
  • 設定リーダー
  • 純粋なポリシー
  • ステートレスなマッパー
リクエスト固有の状態を singleton に持たせることは避けてください。

Scoped

scoped は 1 リクエストまたは 1 単位の処理の中で再利用すべき依存関係に使います。
container.register(UserRepositoryToken, {
  useClass: UserRepository,
  lifetime: "scoped",
});
よい候補:
  • リクエストコンテキスト
  • リクエストトランザクションに紐づくリポジトリ
  • DataLoader インスタンス
  • リクエストローカルなキャッシュ

Transient

transient は、resolve のたびに新しい instance を作るべきときに使います。
container.register(ReportBuilder);
Transient は、状態を共有する必要がない、短期間だけ使うオブジェクトに向いています。

Request scopes

Web フレームワークでは、リクエストが始まるとリクエストスコープが作られ、リクエストが終わると破棄されます。
const scope = container.createScope();

try {
  await handleRequest(scope);
} finally {
  await scope.dispose();
}
対応しているフレームワークでは、アダプターがこれを自動で行います。

Lifetime validation

Wyrly はライフタイムの関係を検証できます。たとえば singleton は scoped な依存関係に依存すべきではありません。プロセス全体で共有されるインスタンスにリクエスト固有の状態が保持されてしまうためです。 テストや CI の一部として検証を実行してください。
const result = container.validate();