Dependency injection into scala objects (not classes)

牧云@^-^@ 提交于 2019-12-14 03:26:57

问题


I have an import "import play.api.libs.ws.WSClient" which i want to use within my object

Object X {
...

}

But this doesn't seem to be available inside my object. I see that dependency injection is only available for classes. How do i get this to work?


回答1:


Injecting a dependency into an object is impossible.

You have two options:

Ugly and deprecated: Access the injector via the global application:

val wsClient = Play.current.injector.instanceOf[WSClient]

Way to go if your code needs to live in an object: Pass the dependency in as a parameter. However this just defers the problem to the caller.

def myMethod(wsClient: WSClient) = // foo

If youre working with a legacy application where you have objects and need an injected dependency, I think one way to "improve" the situation and make a step into the right direction is to provide access to an injected class like so:

object MyObject {
  private def instance = Play.current.injector.instanceOf[MyObject]
  def myMethod(param: String): String =
    instance.myMethod(param)
}

class MyObject @Inject() (wsClient: WSClient) {
  def myMethod(param: String): String = 
   // foo
}

This allows legacy code to access the methods via object, while new code can inject the dependency. You may also annotate the method on the object as deprecated so that users know.



来源:https://stackoverflow.com/questions/44979785/dependency-injection-into-scala-objects-not-classes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!