java - 在 Play (Scala) 中使用 Guice 注释

标签 java scala playframework guice

想象一下 B 类如下:

class B @Inject() (wsClient: WSClient) {
  ...
}

然后在另一个类A中,我需要实例化B:

class A {
  val b = new B()
}

它会提示说我没有在构造函数中指定 wsClient。 解决此问题的一种方法是修改 A :

class A @Inject() (wsClient: WSClient) {
  val b = new B(wsClient)
}

我也可以在我的 B 类中添加一个隐式。但在这两种情况下,对我来说,像这样发送依赖项似乎是非常错误的......

我怎样才能以更优雅的方式做到这一点?

最佳答案

进行 DI 的全部目的是拥有 inversion of control 。您的绑定(bind)决定如何构建应用程序,而不是应用程序中的类负责自己的控制流。

val b = new B(wsClient) 违反了这一原则,因为类负责知道它应该如何构成自身,而不是 DI 框架负责。

class B @Inject() (ws: WSClient){}

class A @Inject() (b: B) // extends B
{} 

正如 @zoltan 提到的,将 B 注入(inject) A 将是解决问题的正确方法。

关于java - 在 Play (Scala) 中使用 Guice 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36890002/

相关文章:

java - 在java中显示不同国家的本地日期/时间

java - 文本清理和替换 : delete\n from a text in Java

Java:我可以使用常量字符串作为枚举键值吗?

validation - Scala中的错误处理单子(monad)?尝试与验证

scala - Scala的MapLike,ListLike,SeqLike等如何分别与Map,List,Seq进行比较?

angularjs - 错误 : Argument is not a function, 未定义

scala - Eclipse 在 Play 2.4 设置中显示错误

playframework - Elasticsearch 抛出异常 : NoNodeAvailableException occured : No node available

java - Android:抽屉导航图标

java - Scala UOM 库