是否可以使用带有guice的scala自我类型?

时间:2017-09-15 15:49:05

标签: scala playframework guice self-type

我有一个控制器:

class HomeController @Inject() (cc: ControllerComponents) extends AbstractController(cc)with Logging 
{
  this: SecuredActionByToken =>

  def index = CheckedToken{ ...

SecuredActionByToken trait 使用类名CheckTokenService验证用户是否可以运行' index' (我们正试图从蛋糕模式转变为Guice)。

是否可以将CheckTokenService注入SecuredActionByToken?当然,我可以将它注入HomeController本身并以某种方式使用它,但是当我们不直接使用它们时,我真的不想将某些服务推送给控制器。

1 个答案:

答案 0 :(得分:0)

我最终为这个bean创建了自己的提供者,这样我可以将服务直接注入提供者并在覆盖特征方法中使用它:

class HomeControllerFactory @Inject()
  (controllerComponents: ControllerComponents, cts: CheckTokenService, dbConfigProvider: DatabaseConfigProvider)
  extends Provider[HomeController]{
  override def get(): HomeController = {
    new HomeController(controllerComponents) with SecuredActionByToken {
      override def checkTokenService: CheckTokenService = cts
    }
  }
}

加上绑定:

bind(classOf[HomeController]).toProvider(classOf[HomeControllerFactory])

我也可以通过创建这样的homeController进行测试:

val testCheckTokenService =...
val homeController = new HomeController(stubControllerComponents()) with SecuredActionByToken {
override def checkTokenService: CheckTokenService = testCheckTokenService....
}