我们可以使用Scala对象使用Google Guice DI,而不是使用scala在Play 2.4中使用Scala类

时间:2015-06-28 13:47:28

标签: scala playframework guice ehcache

我们的应用程序基于 Play 2.4与Scala 2.11和Akka 。 缓存在我们的应用程序中大量使用。我们使用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 {

}

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

那么现在是否可以用scala对象而不是scala类来实现Google Guice DI?

1 个答案:

答案 0 :(得分:2)

不,不可能在guice中注入对象。在您注入SampleDAO的位置,改为使CacheApi成为一个班级。然后在控制器中注入新的DAO类。您还可以使用SampleDAO注释@Singleton。这将确保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
}