https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5
勘違いしていたので認識をアップデート。
広義の「依存性の注入」という概念はあるクラスAが別のクラスBの機能に依存するときに、クラスAの定義内でクラスBを直接記述して利用するような直接依存する方法ではなく、コンストラクタやプロパティを通じて依存するクラスBを外部から受け取る方法のこと。
つまり広義のDIとは、ストラテジパターンなどを含む概念である。
DIを用いないコード
class Calculater { constructor() { this.resultOutputter = new ConsoleOutputter(); } add(n1, n2) { this.resultOutputter.output(n1 + n2); } } class ConsoleOutputter { output(text) { console.log(text); } } var c = new Calculater(); c.add(1, 2);
DIを用いるコード
class Calculater { constructor(resultOutputter) { this.resultOutputter = resultOutputter; // 依存するオブジェクトを外部から『注入』する } add(n1, n2) { this.resultOutputter.output(n1 + n2); } } class ConsoleOutputter { output(text) { console.log(text); } } var outputter = new ConsoleOutputter(); var c = new Calculater(outputter); c.add(1, 2);
https://woshidan.hatenablog.com/entry/2016/02/20/123000
Java Spring FrameworkなどDIコンテナ・フレームワークには、XMLファイル等をもとにこの依存性注入を実行する仕組みがあるが、そのXMLファイルをもとにインスタンスを組み立てる機能が依存性注入だと勘違いしてた。
ただこれは完全に間違いというわけではなく、狭義のDIは「DIコンテナを使って、(定義ファイルを元に)具象クラスの切り替えを行いやすくする手法」であり、それは上記の「XMLファイルをもとにインスタンスを組み立てる機能」のことで合っている。
狭義のDIは、具象クラスの切り替えを手軽に行う事を目的とするという意味で、ストラテジパターンとは別の概念である。