如何使用Google Guice的@Inject与Scala /(Play 2.4.x)

Tec*_*mag 6 dependency-injection scala guice

我准备喝koolaid了:)

Play正在转向Google Guice(https://github.com/google/guice),所以我想我在这里没有真正的选择,只能标记为骑行.

不知怎的,我错过了一些东西.

我得到了"不要打电话给我们,我们会称呼你"的心态和依赖注入解决方案的核心原因 - 更少的脆弱和更可测试的代码.

然而有时我想要的只是一个简单的牙签而且不觉得需要烤蛋糕,或者更糟糕的是还要写一个完整的烘焙配方,只需要一个...

斯卡拉,这种语言似乎使得牙签工厂变得微不足道(Guice的一个论点是建造工厂的成本(用Java) - 所以对我来说这个论点至少不在谈论桌上,但这并没有否定DI的其余部分我知道的问题).

在斯卡拉你有一个同伴object(对不起有一个宁静的闪回 - 我需要片刻 - 好好去 - 哦,并责怪奥德斯基的那些词组合而不是我...).

对于Toothpick类:

case class Toothpick(color: Color) 

object Toothpick {
  def redPlease = {
    Toothpick(Color.RED) 
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以apply通过引用Toothpick"对象" 来获得您想要的精确牙签以及其他一些scala细节:

val myShinyRedToothpick = Toothpick.redPlease
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下Toothpick,它object是一个即时工厂.

轻松做事并不会让事情变得简单 - 只是让事情变得简单.

谷歌Guice的概述似乎是:一个工厂统治他们所有.

好的 - 我可以忍受这个.他们得到了他们的第一个 - 他们拥有所有的土地 - 我们将永远是佃农.游戏结束.

我需要的是如何使用 Guice'd up工厂的牙签示例.我如何从NORMAL Scala代码中获取我的牙签呢?

(就像我说的那样,我可能完全忽略了这一点......所以如果是这样的话,可以随意投掷任何猴子废话让我看向正确的方向).

PS:我不需要为什么教训- 我只想要一个如何.

Ser*_*ity 0

所以嘿,这里有一个复杂的操作方法。(注意:未经测试且完全愚蠢的代码)

public class MyComplicatedGuiceModule extends AbstractModule {
  protected void configure() {
    // does some configuration stuff
  }

  @Provides
  @Named("RedToothPick")
  ToothPick provideRedToothPick() {
    ToothPick(Color.RED)
  }

  @Provides
  @Named("WhiteToothPick")
  ToothPick provideWithToothPick() {
    ToothPick(Color.WHITE)
  }
}
Run Code Online (Sandbox Code Playgroud)

要在你的课堂上使用它,你可以这样做:

public class WildCleanToothService(@Named("RedToothPick") toothPick: ToothPick) {
}
Run Code Online (Sandbox Code Playgroud)

现在,可以公平地争论:为什么会变得复杂?看看Scala 代码使用的行数少了多少?

对我来说,最大的好处是测试实际代码。归结为:如何测试你的伴生对象?如果它调用一些随机服务怎么办?我们如何嘲笑这项服务?能够插入依赖项使得可以轻松地单独测试它们。