具有特征的 Scala Play 2 Guice 依赖注入
Scala Play 2 Guice dependency injection with traits
在我的应用程序中,我有以下 traits/concrete classes:
在包中 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 使用具体的 class。
您需要在代码中的某处创建注入器,通常是在 Play 模块的全局对象中:
object Global extends GlobalSettings {
val injector = Guice.createInjector(
new AbstractModule {
protected def configure() = {
bind(classOf[UserDAO]).to(classOf[UserDAOImpl])
}
}
)
...
}
您需要扩展 AbstractModule
class DaoModule extends AbstractModule {
def configure() = {
bind(classOf[UserDAO])
.to(classOf[UserDAOImpl])
}
}
在conf/application.conf
中你需要添加:
play.modules.enabled += "modules.DaoModule"
在我的应用程序中,我有以下 traits/concrete classes:
在包中 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 使用具体的 class。
您需要在代码中的某处创建注入器,通常是在 Play 模块的全局对象中:
object Global extends GlobalSettings {
val injector = Guice.createInjector(
new AbstractModule {
protected def configure() = {
bind(classOf[UserDAO]).to(classOf[UserDAOImpl])
}
}
)
...
}
您需要扩展 AbstractModule
class DaoModule extends AbstractModule {
def configure() = {
bind(classOf[UserDAO])
.to(classOf[UserDAOImpl])
}
}
在conf/application.conf
中你需要添加:
play.modules.enabled += "modules.DaoModule"