2016-10-04 170 views
1

我有一个模块类具有以下特征:依赖注入玩框架2.5模块

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 2.5中将依赖注入到模块类中?

+0

上面引用部分的示例没有使用@Inject注解,它仅仅表示可以添加构造函数参数。你尝试过吗? – alextsc

+1

什么是ScalaModule或AbstractModule?模块实际上不应该有任何构造函数参数。他们应该为可能需要注入事物的类提供绑定。你究竟想在这里做什么? –

回答

2

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

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

第二个(和更灵活的一个): 根据您要注入的组件的需求,你可以定义你要绑定的组件供应商。在那个供应商你可以注入任何你想要的。例如。

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]) 
    } 
} 

的第二个版本的优点,就是你能注入你什么都喜欢。在第一个版本中,您只需“配置”即可。

+0

谢谢!只是为了记录,这是我最终如何解决它:https://github.com/grantzvolsky/websecute-frontend/commit/b14e5f415640a2a62be8c691c30a738ccb9d3abe – Josef