Interactive

Dependency Injection

Dependency Injection(DI)は、処理が使う依存関係を内部で生成・検索せず、外側から渡す手法です。重要なのは、設定と組み立てを利用コードから分けることであり、DIコンテナを使うことではありません。

採用する場面

  • データベース、外部API、ファイル、メッセージングなどのI/Oへ依存する
  • 時刻、乱数、UUID生成などを決定的にテストしたい
  • 実行環境によって実装や設定が変わる
  • 同じ依存を複数の関連操作で共有し、ライフサイクルを管理する

純粋で安定した小さな関数まで注入しません。引数が増えすぎた場合は、何でも入るコンテナへ逃がす前に、処理の責務が広すぎないか確認します。

実装方針

  • 関数では引数、状態を持つクラスではコンストラクタで依存を受け取る
  • アプリケーションの起動点をComposition Rootとし、具体的な依存をそこで組み立てる
  • 利用コードからグローバルなService Locatorやコンテナを参照しない
  • 契約が必要なら、提供側の全機能ではなく利用側が必要とする最小の形を定義する
  • 接続の開始・終了、transaction、request scopeなど依存の寿命を組み立て側で管理する

DIにinterfaceや抽象クラスは必須ではありません。TypeScriptでは関数型や構造的なオブジェクト型でも契約を表せます。実装が一つで差し替えの要件もない段階に、投機的な抽象化を追加しません。

参考資料