是否可以创建一个具有依赖注入参数的重载play.api.mvc.Controller
特征?
例如,假设我有一些需要依赖注入AuthorizationService的自定义操作。我想写这样的控制器:
class UserController extends CustomController {
def getUser(userID: String) = CustomAction {
...
}
}
但是,我无法弄清楚如何创建CustomController特性,因此它不需要我在我的UserController中注入AuthorizationService。有办法用Guice做到这一点吗?
答案 0 :(得分:4)
您可以在 CustomController 特征中注入一个字段。该字段应该是最终字段,因此必须在Scala中声明为 var 。
@Inject() var authService: AuthorizationService
您还可以将注入的 var 设为私有,并声明引用注入字段的公共 val 。在这种情况下, val 必须 lazy ,因为在实例化类之后会发生注入。有关详细信息,请参阅Guice docs。
@Inject() private var as: AuthorizationService = _
lazy val authService: AuthorizationService = as
答案 1 :(得分:1)
由于特征不可实例化,因此无法在特征中注入依赖关系。特征没有用于定义依赖关系的构造函数,您必须通过UserController注入AuthService
实施例
trait CustomController extends Controller {
val authService: AuthService
...
}
class UserController @Inject()(override val authService: AuthService) extends CustomController {
...
}