なぜService Locatorはメジャーじゃないの

いまさらなんですが、Service LocatorってDIにくらべて脚光を浴びないですね。同じような効果があって、個人的にはDIと同じ程度、最近ではいままでDIを利用していた個所でもMicro Kernel+Service Locatorを使っているのにな、なぜなんでしょうかね。良いフレームワークがないからかな。fowlerも比較して、ほとんど違いがないと言っているし、むしろService Locatorのほうが好みのような記述もあります。

Service Locator 対 Dependency Injection

すぐに思いつく利用ポイントの違いとしては

  • 依存性
    • Service Locatorは最初のロケータについては知る必要がある。
    • DIのコンポーネントはコンテナに依存しない。
  • 柔軟性
    • Service Locatorはインスタンス化のタイミング以外でも新しいサービスを動的に取得可能
    • DIは一旦設定が完了してしまうとそれ以上のサービスをコンテナから取得できない

こんなのが思いつきます。


DIは何にも依存しないので、後付で依存部分を実装できるのがいいんだろうな。でもこれもはじめにレイヤごとぐらいに汎用的なService Locatorを用意すればOKで、Genericsの技術を使えばシンプルなものであれば数行で作成できます。
あと、DIとService Locator両方とも柔軟なワイヤリングの手法としてますます活用されていくとは思いますが、より動的で柔軟なしくみが必要な場合はService Locatorが役に立つことも多いのではないでしょうか。