依存性注入 【DI】 Dependency Injection
あるオブジェクトAがオブジェクトBを呼び出してその機能を利用する場合「AはBに依存している」という。この関係を素朴に記述しようとすると、Aの内部でBを生成して呼び出すコードを記述する形となる。AとBの関係は固定的になり、AがBを利用していることは外部からは分かりにくくなる。
依存性注入を利用する場合、Aのコードの中でBを生成するコードを直に記述することはせずに、Bをメソッドの引数などの形で外部から受け取って呼び出す形とし、Aを呼び出す側がB(に相当するオブジェクト)を与えて利用させる。
これにより、AとBの依存関係は外部から任意に指定・変更できるようになり、Bの代わりに同じインターフェースを実装したB'を与えたり、Bのように振る舞うモックを与えてAのみを対象とする単体テストを行ったりすることができる。
依存性注入では、オブジェクトAにあたる、依存『する』側のことを「クライアント」、オブジェクトBにあたる、依存『される』側を「サービス」と呼ぶことがある。注入をどのように行うかは様々な方式があり、サービスをクライアントのコンストラクタ引数として渡す「コンストラクタインジェクション」(コンストラクタ注入)、setterメソッドを用いる「セッターインジェクション」(setter注入)などがよく知られている。
Webアプリケーションフレームワークなどの中には「DIコンテナ」と呼ばれる専用のツールを備えたものがある。これを利用すれば依存性に関する情報を外部の設定ファイルなどに記述して実行時に解釈させることができ、依存性に関する記述をプログラム本体から切り離すことができる。
(2018.12.30更新)