依赖注入到Play Framework 2.5模块

时间:2016-10-04 23:21:57

标签: scala playframework dependency-injection

我有一个带有以下签名的模块类:

class SilhouetteModule extends AbstractModule with ScalaModule {

我想注入配置:

class SilhouetteModule @Inject() (configuration: Configuration) extends AbstractModule with ScalaModule {

但它失败并出现以下错误。

No valid constructors
Module [modules.SilhouetteModule] cannot be instantiated.

Play文档提到了

  

在大多数情况下,如果您在创建组件时需要访问Configuration,则应将Configuration对象注入组件本身或...

,但我无法弄清楚如何成功地做到这一点。所以问题是,如何在Play 2.5中将依赖注入模块类?

2 个答案:

答案 0 :(得分:3)

有两种解决方案可以解决您的问题。

第一个(更直接的一个): 不要扩展com.google.inject.AbstractModule。而是使用play.api.inject.Module。扩展会强制您覆盖def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]]。在该方法中,您可以执行所有绑定,并将配置作为方法参数插入。

第二个(以及更灵活的一个): 根据您要注入的组件的需要,您可以为要绑定的组件定义提供程序。在该提供者中,您可以注入任何您想要的东西E.g。

import com.google.inject.Provider

class MyComponentProvider @Inject()(configuration:Configuration) extends Provider[MyComponent] {
    override def get(): MyComponent = {
        //do what ever you like to do with the configuration
        // return an instance of MyComponent
    }
}

然后你可以在你的模块中绑定你的组件:

class SilhouetteModule extends AbstractModule {
    override def configure(): Unit = {
        bind(classOf[MyComponent]).toProvider(classOf[MyComponentProvider])
    }
}

第二个版本的优点是,您可以注入您喜欢的任何内容。在第一个版本中,您只需"只需"配置。

答案 1 :(得分:0)

从以下位置更改构造函数签名:

class SilhouetteModule @Inject() (configuration: Configuration) extends AbstractModule with ScalaModule

收件人:

class SilhouetteModule(env: Environment, configuration: Configuration) extends AbstractModule with ScalaModule

有关更多信息,请参见此处: https://github.com/playframework/playframework/issues/8474