2017-09-15 10 views
0

Ich habe einen Controller:Ist es möglich, Scala-Selbst-Typen mit guice zu verwenden?

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

    def index = CheckedToken{ ... 

Wo SecuredActionByTokentrait Klassennamen verwendet CheckTokenService diesen Benutzer überprüfen kann ‚Index‘ laufen (wir versuchen, aus Art Kuchen Muster Guice zu bewegen).

Ist es möglich, CheckTokenService zu SecuredActionByToken zu injizieren? Natürlich könnte ich es auf HomeController selbst injizieren und irgendwie damit arbeiten, aber ich möchte einige Dienste nicht wirklich an Controller weitergeben, wenn sie diese nicht direkt nutzen.

+0

Sie können Konstruktor Injektion und Methode injizieren mischen Wenn Sie Guice verwenden, ist es schwieriger, Tests zu schreiben, wenn Sie Mocks erstellen oder Controller-Instanzen manuell erstellen. Also muss Ihr 'SecuredActionByToken' einen' @Inject def setCheckTokenService (cts: CheckTokenService) 'haben, der nach Instantiierung des Controllers aufgerufen wird. Sehen Sie ein Beispiel [hier] (https://github.com/playframework/playframework/blob/fe0fae19579f5d2e86860adcd2b73f15b20bbec2/framework/src/play/src/main/scala/play/api/mvc/Controller.scala#L170-L198). – marcospereira

Antwort

0

ich meine eigenen Provider für diese Bohne endete die Schaffung, auf diese Weise ich Service direkt an Provider injizieren und es in überschriebene Eigenschaft Methode verwenden:

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

und Bindung:

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

I kann auch testen, indem HomeController wie folgt erstellt wird:

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