gpt4 book ai didi

scala - 在游戏中使用 ActionBuilder 创建自定义 Action 时使用 guice

转载 作者:行者123 更新时间:2023-12-01 23:55:37 25 4
gpt4 key购买 nike

在使用 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 更改为 class 会导致它失败,我尝试将它保留为一个对象,但它无法正确编译。

我怎样才能让它发挥作用?

我让它在我的 Controller 中工作得很好。

最佳答案

通过一些小的更正,您所得到的似乎已经可以工作了。您所要做的就是将 MyAction 的 guice 实例化实例注入(inject)您的 Controller ,然后您可以使用该实例(而不是尝试使用 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 需要能够动态实例化类,以便它可以注入(inject)依赖项。

关于scala - 在游戏中使用 ActionBuilder 创建自定义 Action 时使用 guice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23965449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com