我们是否可以将Google Guice DI与Scala对象一起使用,而不是使用Scala的Play 2.4中的Scala类

我们是否可以将Google Guice DI与Scala对象一起使用,而不是使用Scala的Play 2.4中的Scala类,scala,playframework,guice,ehcache,Scala,Playframework,Guice,Ehcache,我们的应用程序是基于Play2.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 { d

我们的应用程序是基于Play2.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)
    }
  }
}
现在,在Play2.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了吗?

不,不可能在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及其实现吗?以防万一有人也会疑惑@如果将接口和实现分离,则选择“是”。为了简单起见,上面的示例中没有单独的接口。这就是直接注入类(实现)的原因。下面链接中的答案表明可以在Scala对象中注入依赖项。。你知道吗@米格·福克斯巴特这对我来说似乎有点棘手。将
null
赋值给val变量是不好的做法,在Scala的上下文中也是无用的。不能在Scala中重新分配val。在本例中,
val s
将由Guice使用反射重新分配。这就像在Java中重新分配最后一个变量。A不要这样做。不管怎样,你的用例是什么?你不能只用一个类来代替吗?@Roman如果我必须将我的对象转换为类,那么我必须更改将我的目标对象引用到类的其他对象,这会产生连锁反应。我同意你的观点,在对象esp val中注射不是推荐的做法,应该谨慎使用。