是否有可能与guice一起使用scala自我类型?
问题描述:
我有一个控制器:是否有可能与guice一起使用scala自我类型?
class HomeController @Inject() (cc: ControllerComponents) extends AbstractController(cc)with Logging
{
this: SecuredActionByToken =>
def index = CheckedToken{ ...
凡SecuredActionByToken
trait
使用类名CheckTokenService
,以验证用户可以运行“索引”(我们正试图从一种蛋糕图案转移到吉斯)。
是否可以将CheckTokenService
注入SecuredActionByToken
?当然,我可以将它注入HomeController
本身并以某种方式工作,但当我不直接使用它们时,我并不想将某些服务推送给控制器。
答
我结束了创建我自己为这个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....
}
你可以混合构造函数注入和方法注入当使用Guice时,尽管如果您正在创建模拟或手动创建控制器实例,这会使编写测试变得更加困难。所以你的'SecuredActionByToken'需要有一个'@Inject def setCheckTokenService(cts:CheckTokenService)',它将在实例化控制器后被调用。看一个例子[这里](https://github.com/playframework/playframework/blob/fe0fae19579f5d2e86860adcd2b73f15b20bbec2/framework/src/play/src/main/scala/play/api/mvc/Controller.scala#L170-L198)。 – marcospereira