7

Ich migriere eine Scala Play-Anwendung auf 2.5 und verschiebe derzeit meine Komponenten in Abhängigkeitsinjektionen. Es gibt noch einen Ort, an dem ich nicht weiß, wie ich es machen soll. Ich habe eine PathBindable implizite Konvertierung in dem Begleitobjekt definiert:Play Framework PathBindable mit Abhängigkeitsinjektion

object Task { 
    implicit def pathBindable(implicit stringBinder: PathBindable[String]) = 
    new PathBindable[Task] { 
     ... 
    } 
} 

Die Umsetzung des PathBindable muss das Objekt aus einem Repository sehen, aber ich habe keine Möglichkeit, abhängigkeits zu injizieren das Repository hier gefunden. Ich verwende das jetzt veraltet Play-Objekt als Abhilfe:

val tasks = Play.application(Play.current).injector.instanceOf[TasksRepository] 

Irgendwelche Ideen, wie diese richtig zu lösen?

Antwort

0

Ich denke, das ist die einzige Möglichkeit, wie Sie auf Objekte wie diese in Objekten zugreifen können.

Eine bessere Idee ist es, einen Transformator wie diese zu erstellen:

class TaskPathBinder @Inject() (tasks : TaskRepository) extends PathBindable[Task]{ 
    // implementiation 
} 

und als injizieren es in Dienste wie dieser

class NeedsTaskPathBinder @Inject() (service : SomeSerive) (implicit taskPathBinder : TaskPathBinder) { 

    ... 

} 

Hoffe, dass die Sie bekommen die Idee.

+1

Hm, das Problem ist, dass die implizite muss für die Routen verfügbar sein, so dass ich es dort verwenden kann: https://www.playframework.com/documentation/2.5.x/api/scala/index.html# play.api.mvc.PathBindable –