gpt4 book ai didi

scala - 我们可以在带有 Scala 的 Play 2.4 中使用带有 Scala 对象的 Google Guice DI 而不是 Scala 类吗

转载 作者:行者123 更新时间:2023-12-02 01:36:15 24 4
gpt4 key购买 nike

我们的应用程序是基于 Play 2.4 with 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 {

}

上面的例子将dependency 插入到Scala class constructor 中。但是在我们的代码中 SampleDAO 是一个 Scala 对象而不是类

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

最佳答案

不,不能在 guice 中注入(inject)对象。让您的 SampleDAO 成为一个类,您可以在其中注入(inject) CacheApi。然后在 Controller 中注入(inject)新的 DAO 类。您还可以使用 @Singleton 注释 SampleDAO。这将确保 SampleDAO 只会被实例化一次。整个事情看起来像这样:

DAO

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

Controller

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

关于scala - 我们可以在带有 Scala 的 Play 2.4 中使用带有 Scala 对象的 Google Guice DI 而不是 Scala 类吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31100534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com