是否可以用scala-guice注入一个对象?

时间:2014-07-17 15:36:22

标签: scala dependency-injection guice

我想注入scala.io.Source,但我找不到合适的解决方案。这就是我到目前为止所做的:

class Foo @Inject()(var source:Source) {
  // ...
}

和绑定:

class DependencyInjection extends AbstractModule with ScalaModule {
  def configure:Unit = {
     bind[Source.type].to[Source]
     // bind[Source] didn't work
  }
}

也许我可以将scala.io.Source电话打包到本地class,但听起来不对。有没有办法用scala-guice注入对象?

1 个答案:

答案 0 :(得分:3)

因为Source是一个抽象类,并且它没有公开扩展(即使有,但你也无法使用它们,因为它们可能没有已启用Guice),您必须使用提供程序或@Provide方法。

提供商:

class Config extends AbstractModule with ScalaModule {
  override def configure: Unit = {
    bind[Source].toProvider(new Provider[Source] {
      override def get = Source.fromFile("whatever.txt")(Codec.UTF8)
    })
  }
}

// you can also extract provider class and use `toProviderType[]` extension 
// from scala-guice:

class FromFileSourceProvider extends Provider[Source]
  override def get = Source.fromFile("whatever.txt")(Codec.UTF8)
}

class Config extends AbstractModule with ScalaModule {
  override def configure: Unit = {
    bind[Source].toProviderType[FromFileSourceProvider]
  }
}

另一种方法是使用@Provides方法:

class Config extends AbstractModule with ScalaModule {
  @Provides def customSource: Source = Source.fromFile("whatever.txt")(Codec.UTF8)
  // that's it, nothing more
}

我还建议添加一个绑定注释来区分程序中的不同来源,但这完全取决于您的架构。

这种方法与Java中的方法没什么不同,当你需要注入那些不支持Guice或只能通过工厂方法获得的类时。