2

根据可用的文档,这项任务似乎很简单,但是我已经为此苦苦挣扎了几天,仍然无法使其适用于简单的模块间依赖...

这是一个简化的示例:

trait Bla {
  def m: String
}

class BlaImpl(implicit val bindingModule: BindingModule) extends Bla with Injectable {
  val s = inject[String]('bla)
  def m = "got " + s
}

object Program extends App with Injectable {
  implicit val bindingModule =
    new NewBindingModule({ implicit module ⇒ module.bind[Bla] toSingle { new BlaImpl } }) ~
      new NewBindingModule(_.bind[String] idBy 'bla toSingle "bla!")
  val bla = inject[Bla]
  assert(bla.m == "got bla!")
}

尝试构建 BlaImpl 实例时,运行此代码失败并出现以下错误:

 org.scala_tools.subcut.inject.BindingException: No binding for key BindingKey(java.lang.String,Some(bla))

调试显示传递给 BlaImpl 构造函数的绑定模块在其绑定中不包含 'bla String,并且 Program.bindingModule.bindings 具有所有绑定(包括所需的字符串)。

我见过其他类似的问题,但它只指组合而不是跨越模块边界的依赖项。

我究竟做错了什么?

4

1 回答 1

1

不幸的是,它不起作用。即使您将 2 个模块与 subcut 合并在一起,这并不意味着它们会看到彼此之间的依赖关系。

如果要归档所需的结果,则需要BindingModule显式传递给 BlaImpl构造函数。像这样的东西:

val anotherModule = new NewBindingModule(_.bind[String] idBy 'bla toSingle "bla!")

implicit val bindingModule =
  new NewBindingModule({ implicit module => module.bind[Bla] toSingle { new BlaImpl()(anotherModule) } })

在这种情况下,模块合并将无法解决问题。我实际上在这个答案中讨论了这个 subcut 的问题。我什至创建了一个示例代码来比较 subcut 和Scaldi并演示它们如何解决这个问题(或者不解决它,在 subcut 的情况下):

https://gist.github.com/OlegIlyenko/5623423

如果我用Scaldi重写您的示例,那么它将是这样的:

import scaldi.{Injector, Injectable, Module, DynamicModule}

trait Bla {
  def m: String
}

class BlaImpl(implicit inj: Injector) extends Bla with Injectable {
  val s = inject[String]('bla)
  def m = "got " + s
}

object Program extends App with Injectable {
  implicit val appModule =
    new Module { bind [Bla] to new BlaImpl } ::
    DynamicModule(_.binding identifiedBy 'bla to "bla!")

  val bla = inject [Bla]
  assert(bla.m == "got bla!")
}

如您所见,在Scaldi::中,如果模块由or组成,则可以看到彼此之间的依赖关系++

于 2013-06-09T13:20:49.227 回答