我们可以在带有 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
}
我们的应用程序基于 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
}