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

Dependency injection into scala objects (not classes)

我有一个导入 "import play.api.libs.ws.WSClient",我想在我的对象

中使用它
Object X {
...

}

但这在我的对象中似乎不可用。我看到依赖注入仅适用于 类。我如何让它工作?

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

你有两个选择:

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

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

如果您的代码需要存在于一个对象中,方法如下: 将依赖项作为参数传入。然而,这只是将问题推迟到调用者身上。

def myMethod(wsClient: WSClient) = // foo

如果您正在使用一个遗留应用程序,其中有对象并且需要注入依赖项,我认为 "improve" 这种情况并朝着正确方向迈出一步的一种方法是提供对注入的 class 像这样:

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
}

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