Dependency Injection
Dependency Injection(DI)は、処理が使う依存関係を内部で生成・検索せず、外側から渡す手法です。重要なのは、設定と組み立てを利用コードから分けることであり、DIコンテナを使うことではありません。
採用する場面
- データベース、外部API、ファイル、メッセージングなどのI/Oへ依存する
- 時刻、乱数、UUID生成などを決定的にテストしたい
- 実行環境によって実装や設定が変わる
- 同じ依存を複数の関連操作で共有し、ライフサイクルを管理する
純粋で安定した小さな関数まで注入しません。引数が増えすぎた場合は、何でも入るコンテナへ逃がす前に、処理の責務が広すぎないか確認します。
実装方針
- 関数では引数、状態を持つクラスではコンストラクタで依存を受け取る
- アプリケーションの起動点をComposition Rootとし、具体的な依存をそこで組み立てる
- 利用コードからグローバルなService Locatorやコンテナを参照しない
- 契約が必要なら、提供側の全機能ではなく利用側が必要とする最小の形を定義する
- 接続の開始・終了、transaction、request scopeなど依存の寿命を組み立て側で管理する
DIにinterfaceや抽象クラスは必須ではありません。TypeScriptでは関数型や構造的なオブジェクト型でも契約を表せます。実装が一つで差し替えの要件もない段階に、投機的な抽象化を追加しません。