简体   繁体   中英

Play Framework PathBindable with Dependency Injection

I'm migrating a Scala Play application to 2.5 and am currently moving my components to dependency injection. There's one place left where I'm at a loss how to do it though. I have a PathBindable implicit conversion defined in the companion object:

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

The implementation of the PathBindable needs to look up the object from a repository, but I haven't found a way to dependency-inject the repository here. As a workaround I'm using the now deprecated Play object:

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

Any ideas how to solve this properly?

According to Lightbend Engineer Greg Methvin , PathBindables should only depend on the state in the path. The reason is that the code runs on the IO thread and should therefore be fast and not block.

I think this is the only way you can access stuff like this in objects.

A better idea is to create a the transformer like this:

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

and than inject it in services like this

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

   ... 

}

Hope the you get the idea.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM