1

在我的應用程序有以下特點/混凝土類:斯卡拉播放2 Guice的依賴注入特徵

在包models.daos

trait UserDAO // UserDAO.scala 
class UserDAOImpl @Inject() (app: play.api.Appliction) extends UserDAO // UserDAOImpl.scala 

在包controllers

class Application @Inject() (userDao: UserDAO) extends Controller 

然而,當我運行應用程序時,我得到:

ProvisionException: Unable to provision, see the following errors: 

1) No implementation for models.daos.UserDAO was bound. 
    while locating models.daos.UserDAO 
    for parameter 0 at controllers.Application.<init>(Application.scala:15) 
    while locating controllers.Application 
    for parameter 1 at router.Routes.<init>(Routes.scala:31) 
    while locating router.Routes 
    while locating play.api.inject.RoutesProvider 
    while locating play.api.routing.Router 

我是新來的依賴注入,並不真正知道如何告訴Guice使用具體的類。

回答

6

您需要延長AbstractModule

class DaoModule extends AbstractModule { 
    def configure() = { 
    bind(classOf[UserDAO]) 
    .to(classOf[UserDAOImpl]) 
    } 
} 

conf/application.conf您需要添加:

play.modules.enabled += "modules.DaoModule" 
0

你需要在你的代碼的地方創建噴油器,通常在您的播放模塊的全局對象:

object Global extends GlobalSettings { 

    val injector = Guice.createInjector(
    new AbstractModule { 
     protected def configure() = { 
     bind(classOf[UserDAO]).to(classOf[UserDAOImpl]) 
     } 
    } 
) 
    ... 
} 
+0

這給了我一個「無法初始化全局對象」異常。我將它改爲'lazy val',這個錯誤消失了,但它沒有任何效果(仍然是原始錯誤)。如果我在'UserDAO'特性上使用'@ImplementedBy(classOf [UserDAOImpl])'註釋,那麼一切運行良好,但這樣做會破壞注入的目的......我使用的是Play 2.4。 –

+0

在'Global'對象中設置綁定現已被棄用。以編程方式綁定依賴關係的推薦方法是使用模塊。謝謝! –