【问题标题】:Can we use Google Guice DI with a Scala Object instead of a Scala class in Play 2.4 with scala我们可以在 Play 2.4 with scala 中使用 Google Guice DI 和 Scala 对象而不是 Scala 类吗
【发布时间】:2015-09-15 00:32:11
【问题描述】:

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

}

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

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

【问题讨论】:

    标签: scala playframework guice ehcache


    【解决方案1】:

    不,不可能在 guice 中注入对象。将SampleDAO 改为一个类,在其中注入CacheApi。然后在控制器中注入新的 DAO 类。您还可以用@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
    }
    

    【讨论】:

    • 你不需要绑定DAO和它的实现吗?以防万一有人也想知道!
    • @GeorgeNikolaides 如果分离接口和实现,那么是的。为简单起见,上述示例中没有单独的接口。这就是直接注入类(实现)的原因。
    • 以下链接中的答案表明可以在 Scala 对象中注入依赖项。对此有什么想法吗? stackoverflow.com/questions/13791815/…
    • @mig-foxbat 这对我来说似乎很老套。将 null 分配给 val 变量是不好的做法,在 Scala 的上下文中也是无用的。您不能在 Scala 中重新分配 val 。在示例中,val s 将由 Guice 使用反射重新分配。这就像您在 Java 中重新分配最终变量一样。不要做。无论如何,你的用例是什么?你不能只使用一个类吗?
    • @Roman 如果我必须将我的对象转换为类,那么我将不得不更改将我的目标对象引用到类的其他对象,这会产生连锁反应。我同意您的观点,即在对象 esp val 中注入不是推荐的做法,应谨慎使用。
    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2017-01-30
    • 2020-09-19
    相关资源
    最近更新 更多