injection)とは、コンポーネント間の依存関係をプログラムのソースコードから排除するために、外部の設定ファイルなどでオブジェクトを注入できるようにするソフトウェアパターンである。英語の頭文字からDIと略される。概要[編集]DIを利用したプログラムを作成する場合、コンポーネント間の関係はインタフェースを用いて記述し、具体的なコンポーネントを指定しない。具体的にどのコンポーネントを利用するかは別のコンポーネントや外部ファイル等を利用することで、コンポーネント間の依存関係を薄くすることができる。依存関係がプログラムから外部に取り除かれることで、以下のようなメリットが発生する。injectionという用語を作成したのはソフトウェア開発者のマーティン・ファウラーである。呼ばれるアイデアが存在していたが、それを整理・範囲を限定することでDIが生み出された。Frameworkも、誕生当初はDIではなくIoCという表現を用いていた。DIは2000年代前半のJavaによる開発において、極めて複雑な標準仕様となっていたJ2EEの特にEJBに対する批判を背景に広く用いられるようになった。6ではより汎用的なDIコンテナとしての機能を備えたCDIが定義されている。[2]DIの種類[編集]プログラムに依存性を注入する方法としては、以下のような手法が存在する。例[編集]DIの例として、以下にJavaによるDIを用いない場合と手動でのDI、ならびにDIコンテナをイメージした自動でのDIのサンプルコードを示す。初めに、一連のサンプルで用いる各コンポーネントのインタフェースを示す。executeTrades();}DIを用いない状態[編集]以下はDIを用いない場合の実装例である。IOnlineBrokerageServiceインタフェースを実装したクラスのインスタンスを作成しており、これらの実装に深く依存してしまっている。手動でのDI[編集]上記のコードを、手動でDIを行うようにリファクタリングすると下記のようになる。}}この例では、MyApplication.main()が依存性の注入を行っており、VerySimpleStockTraderImpl自体は特定の実装に依存しなくなっている。この実装ではコンストラクタ注入の手法が用いられている。自動的なDI[編集]DIコンテナを用いることで、依存性の注入をコード上に直接記述せず、自動的に行うことが可能である。した手法を用いる場合、依存性は外部のXMLファイルやメタデータにて定義する。上記のコードを、XMLを用いるDIコンテナを使用するようリファクタリングした例が下記である。}}この例では、IAutomatedStockTraderのどの実装を使用するかの判断はDIコンテナに委ねられている。インタフェースが要求されたDIコンテナは、設定ファイルに基づきその実装であるVerySimpleStockTraderImplクラスのインスタンスを返す。VerySimpleStockTraderImplのIStockAnalysisServiceとIOnlineBrokerageServiceの依存性に対して、同様にコンストラクタ注入を行う。DIコンテナには数多くの種類があり、上で示した例はそのごく一部でしかない。実際にはDIコンテナごとに様々な手法が用いられている。DIを用いた単体テスト[編集]DIを用いることで、単体テストにおいて簡単に依存性をテスト用のクラス(モックオブジェクト等)に差し替えることができる。以下はDIを用いた、前述のVerySimpleStockTraderImplクラスのテストケースの例である。IStockAnalysisServiceインタフェースを実装したテスト用クラスを作成し、DIによりそれを注入することで、実際のクラスを用いることなく、単体テストを実現している。}}実装がDBやネットワークにアクセスする場合、また古いEJBのような重たいコンポーネントの場合、そのままでは単体テストを行うことは難しい。上記のようにDIを用いて依存関係のみをテスト用のものに差し替えることで、本来のテスト対象のプログラムには手を加えることなく、簡単に単体テストを行うことができる。依存性の注入がおこなわれる。ShadowDOM)の登場により、巨大なHTMLファイルを小さなHTML要素コンポーネントの集合として記述することが可能になった。そこでslot要素を用いた依存性の注入がおこなわれる。slot要素は弱いinterfaceとして働き、slot要素を用いて定義されたカスタム要素を利用する際に依存性をタグで囲むことで注入できる。下記の例では大きなコンポーネント<my-element-with-slot>が2つの受け入れ可能slotを持っている。利用時にslotを指定したspan要素を挿入することで、<my-element-with-slot>はspan要素に直接依存せずにspan要素を利用できる。プログラミング言語のような明示的interfaceがない(interfaceによる型指定slot要素がない)ために型支援を受けた安全な依存性の注入は現時点ではおこなえないが、適切に設計することで依存性を切り分けることは可能である。</my-element-with-slot>DIコンテナ[編集]DIの機能を提供するフレームワークはDIコンテナと呼ばれる[1]。主なDIコンテナとしては、下記のようなものが存在する。2014年2月20日閲覧。2014年2月20日閲覧。関連項目[編集]ウィキメディア・コモンズには、依存性の注入に関連するカテゴリがあります。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。Cookieに関する声明モバイルビュ。