2017-09-15 64 views
0

我有一个控制器:是否有可能与guice一起使用scala自我类型?

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

    def index = CheckedToken{ ... 

SecuredActionByTokentrait使用类名CheckTokenService,以验证用户可以运行“索引”(我们正试图从一种蛋糕图案转移到吉斯)。

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

+0

你可以混合构造函数注入和方法注入当使用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

回答

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.... 
} 
相关问题