scala - 玩 scala - 通过 Guice Injector 实例注入(inject)依赖项

标签 scala playframework guice

我的应用程序使用带有内置 Guice 支持 DI 的 Play-2.4.2/Scala-2.11.6

我所有的 DAO 都将实现绑定(bind)到接口(interface),如下所示,这应该是 Guice 中最简单的方法

@ImplementedBy(classOf[PersonDAOImpl])
trait PersonDAO {
}

class PersonDAOImpl @Inject()
(
(@NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider,
 protected val cache : CacheApi) extends PersonDAO with SQLWrapper {
..
...

}

上述实现不需要添加任何模块来提供绑定(bind)。

现在由于某种原因,我不想使用 @Inject 注释将依赖项注入(inject)到 Books 类的构造函数中。所以,我尝试如下注入(inject)

class Books {

  val injector = Guice.createInjector()

  val personDAO : PersonDAO = injector.getInstance(classOf[PersonDAOImpl])

..
...

}

但这给我带来了一个 guice 配置异常:

Caused by: com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for play.api.cache.CacheApi was bound.
  while locating play.api.cache.CacheApi
    for parameter 1 at schema.PersonDAOImpl.<init>
  while locating PersonDAO

2)  No implementation for play.api.db.slick.DatabaseConfigProvider annotated with @play.db.NamedDatabase(value=mysql) was bound.
  while locating play.api.cache.CacheApi
    for parameter 2 at schema.PersonDAOImpl.<init>  while locating PersonDAO

现在需要做什么?在这种情况下我的做法是对还是错?有人可以帮我解决这个问题吗?提前致谢。

最佳答案

您可以使用Injector从当前 Play Application .

import play.api.{ Application, Play }
import play.api.inject.Injector

val currentApp: Application = Play.current
val injector: Injector = currentApp.injector
// in short play.api.Play.current.injector

// Then use the injector
import play.api.inject.ApplicationLifecycle
current.injector.instanceOf[ApplicationLifecycle].
  addStopHook { () => ??? }

(请参阅使用 injectorPlay plugin for ReactiveMongo 的示例)

关于scala - 玩 scala - 通过 Guice Injector 实例注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500254/

相关文章:

java - 我可以使用带有构造函数和本地实例的 Guice 抽象模块来提供动态绑定(bind)吗?

java - 如何分析 Guice 配置方法

eclipse - 如何手动安装 Scala 插件?

java - Play Framework CSRF 错误 "[CSRF] Check failed because no token found in headers"

斯卡拉选项?为什么 Some 不继承 AnyVal ,为什么它不是值类型?

playframework - 如何调整 Play Framework 应用程序的可扩展性?

scala - Play 何时何地设置 Content-Length header ?

java - Google Guice 中的 AssistedInject 和 MapBinder

scala - 在 Scala 中创建动态增长数组的最佳方法是什么?

scala - Slick - 如果列为空则过滤行