【问题标题】:Play framework inherit dependency injected trait?播放框架继承依赖注入特征?
【发布时间】:2016-05-09 19:33:01
【问题描述】:

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

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

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

但是,我不知道如何创建 CustomController 特征,这样就不需要我将 AuthorizationService 注入到我的 UserController 中。有没有办法用 Guice 做到这一点?

【问题讨论】:

    标签: scala playframework dependency-injection guice


    【解决方案1】:

    您可以将一个字段注入到您的 CustomController 特征中。该字段不应该是最终的,因此必须在 Scala 中将其声明为 var

    @Inject() var authService: AuthorizationService
    

    您还可以将注入的 var 设为私有并声明一个引用注入字段的公共 val。在这种情况下,val 必须是 lazy,因为注入发生在类实例化之后。详情请见Guice docs

    @Inject() private var as: AuthorizationService = _
    lazy val authService: AuthorizationService = as
    

    【讨论】:

      【解决方案2】:

      不可能将依赖项注入到 trait 中,因为 trait 不可实例化。 trait 没有定义依赖的构造函数,你必须通过 UserController 注入你的 AuthService

      示例。

      trait CustomController extends Controller {
        val authService: AuthService
        ...
      }
      
      class UserController @Inject()(override val authService: AuthService) extends CustomController {
        ...
      }
      

      【讨论】:

        猜你喜欢
        • 2015-11-02
        • 2016-07-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多