2016-10-04 102 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