【问题标题】:Dependency injection into scala objects (not classes)依赖注入到 scala 对象(不是类)
【发布时间】:2017-07-07 21:18:27
【问题描述】:

我有一个要在我的对象中使用的导入“import play.api.libs.ws.WSClient”

Object X {
...

}

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

【问题讨论】:

  • s/object/class/?
  • @Dima 我需要它成为一个对象。

标签: java scala dependency-injection playframework scalaz


【解决方案1】:

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

你有两个选择:

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

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
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多