2017-09-15 60 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.... 
} 
相關問題