我们可以在带有 Scala 的 Play 2.4 中使用 Google Guice DI 和 Scala 对象而不是 Scala class

Can we use Google Guice DI with a Scala Object instead of a Scala class in Play 2.4 with scala

我们的应用程序基于 Play 2.4 与 Scala 2.11 和 Akka。 在我们的 application.We 使用 Play 的默认 EhCache 进行缓存时缓存被大量使用。

我们目前使用缓存对象(play.api.cache.Cache)进行缓存

import play.api.Play.current
import play.api.cache.Cache

object SampleDAO extends TableQuery(new SampleTable(_)) with SQLWrapper {
  def get(id: String) : Future[Sample] = {
    val cacheKey = // our code to generate a unique cache key
    Cache.getOrElse[Future[[Sample]](cacheKey) {
      db.run(this.filter(_.id === id).result.headOption)
    }
  }
}

现在我们计划在 Play 2.4 中使用内置的 Google Guice DI 支持。下面是 Play 2.4 文档提供的示例

import play.api.cache._
import play.api.mvc._
import javax.inject.Inject

class Application @Inject() (cache: CacheApi) extends Controller {

}

上面的示例将 dependency 插入到 Scala class 构造函数 中。 但是在我们的代码中 SampleDAO 是一个 Scala 对象而不是 class

那么现在 可以用 Scala 对象 而不是 Scala class 来实现 Google Guice DI 吗?

不,无法在 guice 中注入对象。将你的 SampleDAO 改为 class,在你注入 CacheApi 的地方。然后在控制器中注入新的 DAO class。您还可以使用 @Singleton 注释 SampleDAO。这将确保 SampleDAO 只会被实例化一次。整个事情看起来像这样:

DAO

@Singleton
class SampleDAO @Inject()(cache: CacheApi) extends TableQuery(new SampleTable(_)) with SQLWrapper {
  // db and cache stuff
}

控制器

class Application @Inject()(sampleDAO: SampleDAO) extends Controller {
  // controller stuff
}