如何集成subcut依赖模块?

时间:2012-09-19 13:59:36

标签: scala dependency-injection subcut

基于可用的文档,这个任务看起来很简单,但是我已经在墙上呆了几天了,但仍然不能使它适用于简单的模块间依赖...

这是一个简化的例子:

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只是指组合而不是跨越模块边界的依赖。

我做错了什么?

1 个答案:

答案 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模块中,如果它们由::++组成,则可以看到每个其他依赖项。