Poor man's DI もしくは Pure DI

samatsu 9/11/2017 3113 N/A Design

少し古い情報ですが、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アプリケーションで使用するコントローラーが依存するサービスクラスは現実的にはそうそう変わることはないので、シンプルにできる点でこのような実装パターンもありなのではと思いました。