Play框架继承依赖注入特征?

时间:2016-05-09 19:33:01

标签: scala playframework dependency-injection guice

是否可以创建一个具有依赖注入参数的重载play.api.mvc.Controller特征?

例如,假设我有一些需要依赖注入AuthorizationService的自定义操作。我想写这样的控制器:

class UserController extends CustomController {
  def getUser(userID: String) = CustomAction {
    ...
  }
}

但是,我无法弄清楚如何创建CustomController特性,因此它不需要我在我的UserController中注入AuthorizationService。有办法用Guice做到这一点吗?

2 个答案:

答案 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 {
  ...
}