Is it possible to use scala self types with guice?

99 Views Asked by At

I have a controller:

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

  def index = CheckedToken{ ...

Where SecuredActionByToken trait is using class names CheckTokenService to verify that user can run 'index' (we are trying to move from kind of cake pattern to Guice).

Is it possible to inject CheckTokenService to SecuredActionByToken? Of course, I could inject it to HomeController itself and work somehow with it, but I don't really want to push some services to controllers when they don't directly use them.

1

There are 1 best solutions below

0
On

i ended up creating my own provider for this bean, this way I can inject service directly to provider and use it in overriden trait method:

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
    }
  }
}

plus binding:

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

I can also test is by creating homeController like this:

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