自定义操作中的依赖注入API

时间:2015-08-07 08:29:45

标签: scala dependency-injection playframework-2.0 guice

我目前正在将Play 2.3项目迁移到Play 2.4中,并且我正面临着一些问题。 从Play 2.4开始,一些API作为WSClient和DBApi被Guice注入控制器。

class MyController @Inject() (ws: WSClient, db: DBApi) extends Controller {}

现在我遇到的问题是我需要在某些自定义操作中使用这些API,我想知道我应该如何使用这些API提供操作。

这样做的一个显而易见的方法是将这些参数显式传递给动作,如下所示:

object MyAction(p: Privilege.Value, db: DBApi, ws: WSClient) extends ActionBuilder[Request]{}

然后调用这样的动作:

class MyController @Inject (db: DBApi, ws: WSClient) extends Controller {
  def blubb = MyAction(Privilege.admin, db, ws).async(parse.json) { implicit request =>
    Future.successful(Ok("just a demo"))
  }
}

但我更愿意以某种方式隐含地提交注入的API:

object MyAction(p: Privilege.Value)(implicit db: DBApi, ws: WSClient) extends ActionBuilder[RequestContext] {}

就像这样称呼它,就像我从那时起做的那样; - )

class MyController @Inject (implicit db: DBApi, ws: WSClient) extends Controller {
  def doSomething = MyAction(Privilege.admin).async(parse.json) { implicit request =>
    Future.successful(Ok("just a demo"))
  }
}

但这不起作用......

有没有人知道如何处理这个问题?

祝你好运 塞缪尔

1 个答案:

答案 0 :(得分:2)

感谢JohanAndrén:https://groups.google.com/forum/#!topic/play-framework/aUIjB2R6BE4

,我终于找到了解决方案

他基本上建议创造一个这样的特征:

trait Authentication {
  def db: DBApi
  def ws: WSClient

  case class DataAction(privilege: Privilege.Value) extends ActionBuilder[RequestContext] with I18nSupport {
    // use db and ws to do your thing
  }
}

然后将在所需的控制器中混合。

class MyController @Inject (val db: DBApi, val ws: WSClient) extends Controller with Authentication {
  def doSomething = Authenticated(Privilege.admin).async(parse.json) { implicit request =>
    Future.successful(Ok("just a demo"))
  }
}