scalaでDI

以下の記事のscalaでDIの話はなかなかscalaらしい面白い解決策を提示してい面白いですね。
http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/

どんな方法かというと、

  • traitに抽象メンバ変数もたせて、DI対象のクラスではそれを参照。これで対象のクラスから実装への参照を消す
  • singletonのComponentReistryでtraitをwithして、その中で上記のメンバ変数に具象クラスを生成して代入

することで、実証の参照を具象クラスから消しつつ、ComponentRegistyで実装を注入できるようにしている。
traintでくくらなきゃいけないのが若干書き方が気持ち悪いような気はするけど、scalaらしい面白いパターンだなぁ。

scala本にでてくるDIは実行時にSingletonなクラスのメンバ変数を実行時にかきかえる形で実現しているんだけど、それとはちょっと違うなぁと。本の例を見ていて思ったのは、今までsingletonはtestability損ねるから悪といわれていたけれど、scalaみてるとsingletonなクラスに実装さしこむのもoverrideもできるし、testabilityを損ねることもなさそうだなぁという印象。言語での前提がかわったときには常識にある前提から考え直したほうがいいかもなぁと少し思ったり。