来自特质的Guice和Play2 Singleton

Gle*_*eeb 6 scala guice playframework playframework-2.0

我正在使用Play with Scala,我正在尝试创建一个单例,我想从它的特性而不是直接注入它.

例如:

@ImplementedBy(classOf[S3RepositoryImpl])
trait S3Repository {
}
@Singleton
class S3RepositoryImpl extends S3Repository {
}
Run Code Online (Sandbox Code Playgroud)

但这失败了,错误:

特质是单身是抽象的; 无法实例化

我尝试了几种组合,它们都产生了相同的效果.

我来自春天的背景,它很自然吗?我错过了Guice如何处理这种类型的注射剂吗?

谢谢.

Chr*_*ach 31

正如@ Tavian-Barnes所指出的,解决方案是确保您拥有以下导入:

import javax.inject.Singleton
Run Code Online (Sandbox Code Playgroud)


ins*_*n-e 6

我这里有一个"完整的"工作实例,只是希望我没有陈述明显的......

package controllers

import play.api._
import play.api.mvc._
import com.google.inject._

class Application @Inject() (s3: S3Repository) extends Controller {
  def index = Action {
    println(s3.get)
    Ok
  }
}

@ImplementedBy(classOf[S3RepositoryImpl])
trait S3Repository {
  def get: String
}

@Singleton
class S3RepositoryImpl extends S3Repository {
  def get: String = "bla"
}
Run Code Online (Sandbox Code Playgroud)

每当你使用@InjectGuice 标记一个类的构造函数时,它将管理实例本身的注入.所以,如果你把你的课程标记为@Singleton,Guice会创建并且总是只给你一个实例.没有人可以阻止您在代码中手动实例化类...您可以在Play中详细探索它.