Singleton
singleton はステートレスなサービスや、プロセス全体で共有する依存関係に使います。
- loggers
- 設定リーダー
- 純粋なポリシー
- ステートレスなマッパー
Scoped
scoped は 1 リクエストまたは 1 単位の処理の中で再利用すべき依存関係に使います。
- リクエストコンテキスト
- リクエストトランザクションに紐づくリポジトリ
- DataLoader インスタンス
- リクエストローカルなキャッシュ
Transient
transient は、resolve のたびに新しい instance を作るべきときに使います。
Request scopes
Web フレームワークでは、リクエストが始まるとリクエストスコープが作られ、リクエストが終わると破棄されます。子スコープ(v2.1+)
scope.createChildScope() で、1 リクエスト内のネストした単位(GraphQL subscription の operation など)を表現できます。
- 子を先に dispose しないと親の dispose は
ScopeHasActiveChildrenErrorになります。 - 子は親の
set()値と scoped インスタンスを参照できます。 - 新しい scoped インスタンスは、resolve したスコープにのみ格納されます。
Lifetime validation
Wyrly はライフタイムの関係を検証できます。singleton が scoped に直接または間接的に依存していないか、register() が @Injectable の deps / lifetime と矛盾していないかを確認します。
テストや CI の一部として検証を実行してください。