注入一个对象列表来播放应用程序上下文

时间:2017-07-26 13:58:03

标签: scala playframework playframework-2.0 guice playframework-2.2

在我的项目中我有很多动物对象,例如:

其中一些人有依赖注入:

class Monkey @Inject() (wsClient: WSClient, configuration: Configuration) extends Animal {
    ...
}

有些不是:

class Giraffe extends Animal {
    ...
}

在我的AnimalsService课程中,我需要一个包含所有动物对象实例的列表

目前我的服务是将人员列表作为依赖注入:

class AnimalsService @Inject() (animals: List[Animal]) {
    // here I can use animals as my desire
}

然后我有一个绑定它的绑定类:

class Bindings extends AbstractModule {
  override def configure(): Unit = {
    bind(classOf[AnimalsService]).toProvider(classOf[AnimalServiceProvider])
  }
}

object Bindings {
  class AnimalServiceProvider @Inject () (giraffe: Giraffe, monkey: Monkey ...) extends Provider[AnimalsService] {
    override def get: AnimalsService = {
      new AnimalsService(List(giraffe,monkey...))
    }
  }
}

这很好用,但我想要的是在应用程序加载时以某种方式将列表添加到我的应用程序上下文中,所以我不需要这样做....

这个当前的解决方案还意味着我需要在AnimalServiceProvider构造函数中添加新动物,并在每次需要新动物时添加到新AnimalsService(List(giraffe,monkey...)),这将不断发生......

处理这种情况的最佳方式是什么?

我想可能使用@Named注释guice但不确定它是否正确或如何以这种方式命名对象列表......

1 个答案:

答案 0 :(得分:0)

我会做一个包含列表的Singleton bean和一个添加定义的方法

class AnimalsService @Inject() () {
    val animals: List[Animal]
    def addAnimal(animal: Animal) {
        ....
    }
    // here I can use animals as my desire
}

然后在需要动物的每个模块中需要一个额外的单身Eager bindings

class MonkeyConfigurator @Inject() (animalsService: AnimalsService) extends Animal {
    animalsService.add(this) //Or anything
    // here I can use animals as my desire
}