基于可用的文档,这个任务看起来很简单,但是我已经在墙上呆了几天了,但仍然不能使它适用于简单的模块间依赖...
这是一个简化的例子:
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具有所有绑定(包括所需的String)。
我见过other question类似但它的dows只是指组合而不是跨越模块边界的依赖。
我做错了什么?
答案 0 :(得分: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) } })
在这种情况下,模块合并不会起作用。我实际上在this answer中讨论过subcut的这个问题。我甚至创建了一个示例代码来比较subcut和Scaldi,并演示它们如何解决这个问题(或者在子切割的情况下不解决它):
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模块中,如果它们由::
或++
组成,则可以看到每个其他依赖项。