DI(依存性注入)とは
ChatGPTの回答は以下。
DIとはあるオブジェクトが他のオブジェクトを直接生成せずに、外部から提供されることでそのオブジェクトの依存関係を明示的にすること。
なぜ使うとメンテナンスしやすくなるのか
以下4つほどがあると思う。それぞれ詳細についは別記事にまとめたりしようと思うが、現時点ではイメージを持つため詳細の説明は省く。
-
疎結合の実現
クラス間で密結合になっていると、修正時に影響も出るためクラス間は疎結合であることが望ましい -
テストの容易さ
DIを使っていないと、モックやスタブのを使用するのが難しくなる
この内容については後ほど別記事にまとめる -
SOLID原則の遵守
SOLIDの原則について詳細を把握していないため、後ほど別記事にまとめる -
その他の向上
柔軟性、拡張性、再利用性、メンテナンス性など色々な面で利便性がある
この辺りも深掘りできそなので、後ほど別記事にまとめる
DIを使う前と使った後の違い
DI未使用
public class SampleController
{
private readonly SampleService _sampleService;
public SampleController(SampleService sampleService)
{
// 具体的な実装に依存
_sampleService = new SmpleService();
}
public ActionResult Index()
{
_sampleSerivce.Action();
// 何かしらreturn
}
}
public class SampleService
{
public SampleService()
{
}
public void Action()
{
// 何かしらの処理を実装
}
}
DI使用
public class SampleController
{
private readonly ISampleService _sampleService;
public SampleController(ISampleService sampleService)
{
_sampleService = sampleService;
}
public ActionResult Index()
{
_sampleSerivce.Action();
// 何かしらreturn
}
}
public class ISampleService
{
void Action();
}
public class SampleService : ISampleService
{
public SampleService()
{
}
public void Action()
{
// 何かしらの処理を実装
}
}
まとめ
インスタンス化する時に、具体的なクラスを使うのか、インタフェースで定義されている抽象的なクラスを使うかによって保守開発やリファクタリングで、やりやすさの差が出る
テスト実装やSOLID原則、その他についてはこれから調査して行くが、以下参考書もあるため、目を通していく。
なぜ依存を注入するのか DIの原理・原則とパターン (Compass Booksシリーズ)