如何使用谷歌Guice';s@注入Scala/(播放2.4.x)

如何使用谷歌Guice';s@注入Scala/(播放2.4.x),scala,dependency-injection,guice,Scala,Dependency Injection,Guice,我已经准备好喝可乐了:) Play正在迁移到GoogleGuice(),所以我想我在这里没有真正的选择,只能跟着它一起玩 然而,不知何故,我错过了一些东西 我有一种“不要打电话给我们,我们会打电话给你”的心态,这也是依赖注入解决方案的核心原因——不那么脆弱,更易于测试的代码 然而,有时我想要的只是一根简单的牙签,而不觉得有必要烤蛋糕,或者更糟糕的是,写一份烤蛋糕的完整食谱,只是为了得到一个 Scala语言似乎使牙签工厂变得微不足道(Guice的一个论点是构建工厂的成本(Java)——所以对我来说

我已经准备好喝可乐了:)

Play正在迁移到GoogleGuice(),所以我想我在这里没有真正的选择,只能跟着它一起玩

然而,不知何故,我错过了一些东西

我有一种“不要打电话给我们,我们会打电话给你”的心态,这也是依赖注入解决方案的核心原因——不那么脆弱,更易于测试的代码

然而,有时我想要的只是一根简单的牙签,而不觉得有必要烤蛋糕,或者更糟糕的是,写一份烤蛋糕的完整食谱,只是为了得到一个

Scala语言似乎使牙签工厂变得微不足道(Guice的一个论点是构建工厂的成本(Java)——所以对我来说,这个论点至少是不存在的,但这并不否定我所知道的其他DI问题)

在scala中,你有一个同伴
object
(很抱歉有一个宁静的闪回——我需要一点时间——好的,开始吧——哦,还有,请怪奥德斯基,因为这两个词的组合不是我……)

对于牙签类:

case class Toothpick(color: Color) 

object Toothpick {
  def redPlease = {
    Toothpick(Color.RED) 
  }
}
当然,只要参考
牙签
的“对象”,您就可以通过
应用
和大量其他scala细节获得您想要的准确牙签:

因此,在本例中,
牙签
对象是一个即时工厂

让事情变得容易并不意味着它是对的——它只是让事情变得容易而已

谷歌Guice的概述似乎是:一个工厂来管理所有的Guice

好吧,我可以接受。他们得到了第一个--他们拥有所有的土地--我们将永远是佃农。比赛结束了

我需要的是如何使用一个Guice'd up工厂的牙签示例。请问如何从Scala代码中获取我那该死的牙签

(就像我说的,我可能完全没有抓住要点……所以如果是这样的话,你可以随意扔任何猴子屎,让我朝正确的方向看)


PS:我不需要一堂关于为什么的课-我只想要一堂关于如何

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

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

public class WildCleanToothService(@Named("RedToothPick") toothPick: ToothPick) {
}
现在,可以公平地说:为什么会出现这种复杂情况?看看Scala代码使用了多少行


对我来说,最大的好处是测试实际代码。它归结为:如何测试您的同伴对象?如果它调用了一些随机服务呢。我们如何嘲笑这项服务?能够独立测试插件依赖项使单独测试它们成为可能。

Odersky使用了“伴生模块”。他们厌倦了解释你用关键字object定义一个模块。@som snytt是一个有趣的历史小道消息。谢谢——有趣的是,一个简单的词怎么会被误解:)碰到了这个——它可能会有帮助。。。您可以从Guice或带注释的实例中获取单例,等等。这是交易的绑定端-我想要事物的非绑定端-如何使用从Guice的混合器中提取的类/单例/方法/字段…(或者可能如何提取…)我完全忽略的一件大事是,获得注入类的唯一方法是从注入类内部获得。(这显然是“一路下来的海龟”比喻的意思,或者至少是推断出来的。)当你摸索这个概念的时候,剩下的就变得容易多了。然而,在你这么做之前,你注定要永远得到你在“海龟堆”之外尝试的任何Guice咒语的空引用。因此,答案不是集中在如何获得牙签,而是如何获得一堆海龟,从中可以获得牙签。这部分是正确的。从某种意义上说,Guice并不限制您在层次结构中的任何位置获取任何特定类。事实上,我认为需要考虑的规则是,如果您想要“注入”一个类,那么它的所有依赖项也应该“注入”。例如,我可以创建一个独立类,获取对注入器的引用,或者(a)注入器类,Guice将为我填充依赖项(b)自己创建实例,确保所有依赖项都由我管理。
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)
  }
}
public class WildCleanToothService(@Named("RedToothPick") toothPick: ToothPick) {
}