使用 ActionBuilder 创建自定义 Action 时如何使用 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
}
}
所以将其从object
to a class
导致它失败,我尝试将其保留为对象,但随后它无法正确编译。
我怎样才能让它发挥作用?
我让它在我的控制器中工作得很好。
经过一些小的修正,你所得到的似乎已经可以工作了。您所要做的就是注入 guice 实例化的实例MyAction
到你的控制器中,然后你可以使用该实例(而不是尝试使用MyAction
班级名称)。
这适用于 Play 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)
}
}
你不能使用object
因为这违反了 Guice 的设计。object
是由 Scala 本身实例化的单例,不能有实例变量,而 Guice 需要能够动态实例化类,以便可以注入依赖项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)