Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对集合成员使用带有辅助注入的Guice多重绑定_Java_Scala_Guice - Fatal编程技术网

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
实例

但是,我不知道在
模块中使用的语法。multibinder
addBinding
似乎没有任何连接
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]))
  }
})