少し古い情報ですが、Poor man's dependency injectionという考え方に触れることがあったのでメモをしておきます。ASP.NET MVC でコントローラーを実装するときに、DIフレームワークを利用するのはよくあることだと思います。個人的にはNInjectをよく使っていましたし、ASP.NET Coreは標準でDIの機能が組み込まれるようになりました。
最近知ったのですが、DIフレームワークでがちがちに依存性を持たせないようにする代わりに、もっと気楽な感じでDIを使う Poor man's dependency injection (もたは Pure DI)というパターンもあるみたいですね。Dino Esposite のブログで取り上げられていました。
Poor man’s dependency injection
https://software2cents.wordpress.com/2013/03/29/poor-mans-dependency-injection/
上記サンプルサイトで利用されているコードは次のようなものです。
public class HomeController : Controller { private readonly IHomeService _workerService; public HomeController() : this(new HomeService()) { } public HomeController(IHomeService service) { _workerService = service; } ... }
コードを見てわかる通り、2つのコンストラクターが定義されています。通常ASP.NETではコントローラーを初期化するときに、引数を取らないコンストラクターが呼び出されます。このとき、引数を取るコンストラクターを呼び出すことでサービスクラスを初期化していることがわかります。
サービスクラスを引数に取るコンストラクターはテスト時に使用します。テストコードの中で、利用します。コンストラクターの引数にテスト用のサービスクラスやモックオブジェクトを渡すことでテスタビリティーを確保しています。
Webアプリケーションで使用するコントローラーが依存するサービスクラスは現実的にはそうそう変わることはないので、シンプルにできる点でこのような実装パターンもありなのではと思いました。
さんのコメント: さんのコメント: