Java 对集合成员使用带有辅助注入的Guice多重绑定
我有一个类Java 对集合成员使用带有辅助注入的Guice多重绑定,java,scala,guice,Java,Scala,Guice,我有一个类PluginManager,它使用Guice多绑定特性接受一个Set。但是,PluginManager有一些运行时信息需要传递给Plugin构造函数 这似乎是Guice辅助注入的一个完美用例,即我的PluginManager将Set注入,其中运行时信息提供给每个工厂,从而产生所需的Plugin实例 但是,我不知道在模块中使用的语法。multibinderaddBinding似乎没有任何连接FactoryModuleBuilder结果的功能 显然,我可以创建自己的自定义工厂实现和多绑定,
PluginManager
,它使用Guice多绑定特性接受一个Set
。但是,PluginManager
有一些运行时信息需要传递给Plugin
构造函数
这似乎是Guice辅助注入的一个完美用例,即我的PluginManager
将Set
注入,其中运行时信息提供给每个工厂,从而产生所需的Plugin
实例
但是,我不知道在模块中使用的语法。multibinderaddBinding
似乎没有任何连接FactoryModuleBuilder
结果的功能
显然,我可以创建自己的自定义工厂实现和多绑定,但有没有办法将多绑定与辅助注入结合起来?我认为这为您提供了一个示例,让您可以完全按照自己的意愿来做。请注意,scala的multibinder有一个挂起的pull请求,允许您在多个位置创建set binder
object Test {
trait Plugin {
def name(): String
}
object Plugin {
trait Factory[+T <: Plugin] {
def newPlugin(name: String): T
}
}
case class MyPlugin @Inject() (@Assisted name: String) extends Plugin
case class OtherPlugin @Inject() (@Assisted name: String) extends Plugin
class PluginManager @Inject() (pluginFactories: Set[Plugin.Factory[Plugin]]) {
for (factory <- pluginFactories) {
println(factory.newPlugin("assisted injection"))
}
}
def main(args: Array[String]): Unit = {
val injector = Guice.createInjector(new ScalaModule {
override def configure(): Unit = {
val plugins = ScalaMultibinder.newSetBinder[Plugin.Factory[Plugin]](binder)
plugins.addBinding().to[Plugin.Factory[MyPlugin]]
plugins.addBinding().to[Plugin.Factory[OtherPlugin]]
bindFactory[Plugin, MyPlugin, Plugin.Factory[MyPlugin]]()
bindFactory[Plugin, OtherPlugin, Plugin.Factory[OtherPlugin]]()
bind[PluginManager].asEagerSingleton()
}
def bindFactory[I: Manifest, C <: I : Manifest, F: Manifest](): Unit = {
import net.codingwell.scalaguice._
install(new FactoryModuleBuilder()
.implement(typeLiteral[I], typeLiteral[C])
.build(typeLiteral[F]))
}
})
}
}
对象测试{
特征插件{
def name():字符串
}
对象插件{
trait Factory[+T谢谢,我很接近这一点,但我的Factory trait上没有泛型类型,因此Guice告诉我,我无法绑定每个插件,因为它已经绑定。这非常有效!顺便说一句,我确实遇到了您提到的scala Guice和Multibinder()但是您引用的拉取请求中的代码修复了它。谢谢!我知道它是这样的!=)我编写了拉取请求=)。
val injector = Guice.createInjector(new ScalaModule {
override def configure(): Unit = {
bindPlugin[MyPlugin]()
bindPlugin[OtherPlugin]()
bind[PluginManager].asEagerSingleton()
}
def bindPlugin[T <: Plugin : Manifest](): Unit = {
val plugins = ScalaMultibinder.newSetBinder[Plugin.Factory[T]](binder)
plugins.addBinding().to[Plugin.Factory[T]]
bindFactory[Plugin, T, Plugin.Factory[T]]()
}
def bindFactory[I: Manifest, C <: I : Manifest, F: Manifest](): Unit = {
import net.codingwell.scalaguice._
install(new FactoryModuleBuilder()
.implement(typeLiteral[I], typeLiteral[C])
.build(typeLiteral[F]))
}
})