Scala 在游戏中使用ActionBuilder创建自定义动作时使用guice

Scala 在游戏中使用ActionBuilder创建自定义动作时使用guice,scala,playframework,guice,Scala,Playframework,Guice,使用ActionBuilder创建自定义操作时如何使用guice 如果我将ActionBuilder从对象更改为类,它似乎会抱怨“找不到:值MyAction” 我有这个,但不起作用: case class MyModel(name: String, request: Request[A]) extends WrappedRequest[A](request) class MyAction @Inject()(userService: UserService) extends ActionBui

使用ActionBuilder创建自定义操作时如何使用guice

如果我将ActionBuilder从对象更改为类,它似乎会抱怨“找不到:值MyAction”

我有这个,但不起作用:

case class MyModel(name: String, request: Request[A]) extends WrappedRequest[A](request)

class MyAction @Inject()(userService: UserService) extends ActionBuilder[MyModel] {
  def invokeBlock[A](request: Request[A], block: (MyModel[A]) => Future[SimpleResult]) = {
    val abc = loadAbc(request)
    block(new MyModel(abc, request))
  }

  def loadAbc(rh: RequestHeader): String {
    "abc" // just for testing
  }
}
因此,将它从
对象
更改为
会导致它失败,我尝试将它保留为对象,但它无法正确编译

我怎样才能让它工作


我的控制器可以正常工作。

如果您这样使用它,我认为您的代码应该可以工作:

class MyClass @Inject()(myAction: MyAction) {
  val echo = myAction { request =>
    Ok("Got request [" + request + "]")
  }
}

经过一些小的修正,你得到的似乎已经起作用了。您所要做的就是将
MyAction
的guice实例化实例注入控制器,然后您可以使用该实例(而不是尝试使用
MyAction
类名)

这适用于重头戏2.3:

import scala.concurrent.Future
import javax.inject.{Inject, Singleton}
import play.api.mvc._

class UserService() {
  def loadAbc(rh: RequestHeader) = "abc"
}

class MyModel[A](val name: String, request: Request[A]) extends WrappedRequest[A](request)

class MyAction @Inject()(userService: UserService) extends ActionBuilder[MyModel] {
  def invokeBlock[A](request: Request[A], block: (MyModel[A]) => Future[Result]) = {
    val abc = userService.loadAbc(request)
    block(new MyModel(abc, request))
  }
}

@Singleton
class Application @Inject() (myAction: MyAction) extends Controller {
  def index = myAction { request =>
    Ok(request.name)
  }
}

您不能使用
对象
,因为这违反了Guice的设计<代码>对象是由Scala本身实例化的单例,不能有实例变量,而Guice需要能够动态实例化类,以便注入依赖项。

最初我的自定义操作是一个“对象”,我可以保持这种方式吗?它是按请求实例化的吗?我不知道如何将Guice与
对象一起使用。但是,如果您希望每次都使用同一个实例,可以在
MyAction
的定义上方使用Guice的
@Singleton
注释。我不确定我在做什么,但我必须在操作中使用类名而不是实例。谢谢嗨,如果我想给MyAction添加一个参数呢?我似乎做不到,例如,
类MyAction(id:Int=1)@Inject….
我是做错了还是不可能?在
(userService:userService)
列表中添加您的参数我想在我的控制器中添加参数,如:
MyAction(“hello”{request=>…}