我有一个控制器:
class HomeController @Inject() (cc: ControllerComponents) extends AbstractController(cc)with Logging
{
this: SecuredActionByToken =>
def index = CheckedToken{ ...
SecuredActionByToken
trait
使用类名CheckTokenService
验证用户是否可以运行' index' (我们正试图从蛋糕模式转变为Guice)。
是否可以将CheckTokenService
注入SecuredActionByToken
?当然,我可以将它注入HomeController
本身并以某种方式使用它,但是当我们不直接使用它们时,我真的不想将某些服务推送给控制器。
答案 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....
}