依赖注入scala对象(不是类)

时间:2017-07-07 21:18:27

标签: java scala dependency-injection playframework scalaz

我有一个导入"导入play.api.libs.ws.WSClient"我想在我的对象中使用

Object X {
...

}

但这似乎并没有出现在我的对象中。我看到依赖注入仅适用于类。我如何让这个工作?

1 个答案:

答案 0 :(得分:3)

将依赖项注入对象是不可能的。

您有两种选择:

丑陋和弃用:通过全局应用程序访问注入器:

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

如果您的代码需要存在于对象中,那么该方法:将依赖项作为参数传递。然而,这只是将问题推迟给调用者。

def myMethod(wsClient: WSClient) = // foo

如果您正在使用遗留应用程序,其中您有对象并需要注入依赖项,我认为有一种方法可以改善"这种情况并朝着正确的方向迈出了一步,提供了一个注入类的访问权限:

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
}

这允许遗留代码通过对象访问方法,而新代码可以注入依赖项。您还可以将对象上的方法注释为已弃用,以便用户知道。