依存性の注入(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();
}