依存性の注入(Dependency Injection)

簡潔に

外部からインスタンスを注入すること。
以下のクラスAはクラスBに依存している。

  • クラスA:依存している
  • クラスB:依存されている
class A { private B B; }

class B {}

クラスAのメンバ変数のクラスBを外部から注入する。

コード例解説

依存性の注入はSOLID原則の依存性逆転の原則を実装するために必要な概念。
依存している側で依存されている側のインスタンスは生成せず、外部から渡す。
このとき、依存している側はインターフェイスで受け取る。
以下のコードについて、

interface IBoxing
{
  public int Jab();
}

class Sparring : IBoxing
{
  public int Jab() => 60;
}

class Fighting : IBoxing
{
  public int Jab() => 100;
}

class TitleMatch
{
  private IBoxing IBoxing;
  TitleMatch()
  {
    this.IBoxing = new Fighting(); // ★
  }
  
  public int Attack() => this.IBoxing.Jab();
}

上記の★の部分は依存している側でインスタンスを生成してしまっている。
タイトルマッチに向けてのファイトキャンプでスパーリングをしたい場合、★を修正する必要がある。
ファイトキャンプ中はnew Sparring();に変えたが、ファイトキャンプ終了時にnew Fighting();に戻さなかった場合、 60%の力でタイトルマッチに望むことになる。
そこで、外部からIBoxingを注入する。

class TitleMatch
{
  private IBoxing IBoxing;
  TitleMatch(IBoxing iBoxing)
  {
    this.IBoxing = iBoxing; // ★
  }
  
  public int Attack() => this.IBoxing.Jab();
}