自定义操作中的依赖注入 API
Dependency Injected APIs in custom Actions
我目前正在将一个 Play 2.3 项目迁移到 Play 2.4,但遇到了一些问题。
从 Play 2.4 开始,Guice 将一些 API 作为 WSClient 和 DBApi 注入到控制器中。
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"))
}
}
但这行不通...
有人知道如何处理吗?
此致
塞缪尔
感谢 Johan André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"))
}
}
我目前正在将一个 Play 2.3 项目迁移到 Play 2.4,但遇到了一些问题。 从 Play 2.4 开始,Guice 将一些 API 作为 WSClient 和 DBApi 注入到控制器中。
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"))
}
}
但这行不通...
有人知道如何处理吗?
此致 塞缪尔
感谢 Johan André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"))
}
}