我想注入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注入对象?
答案 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或只能通过工厂方法获得的类时。