Scala 如何集成子割相关模块?

Scala 如何集成子割相关模块?,scala,dependency-injection,subcut,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 Progr

根据可用的文档,这项任务似乎很简单,但是我已经为此头痛了好几天了,仍然无法使它适用于简单的模块间依赖关系

下面是一个简化的示例:

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”字符串,并且Program.bindingModule.bindings具有所有绑定(包括所需的字符串)

我见过类似的例子,但它只涉及组合,而不涉及跨越模块边界的依赖项


我做错了什么?

不幸的是,它不起作用。即使您将两个模块合并在一起 对于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) } })
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!")
}
在这种情况下,模块合并不会起作用。实际上,我在年讨论了分切的问题。我甚至创建了一个示例代码来比较subcut和,并演示它们如何解决这个问题(或者在subcut的情况下不解决它):

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

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

implicit val bindingModule =
  new NewBindingModule({ implicit module => module.bind[Bla] toSingle { new BlaImpl()(anotherModule) } })
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!")
}

正如您所看到的,如果模块中的依赖项由
++
组成,则它们可以看到彼此的依赖项。谢谢您的回答。因为这个和其他一些问题,我很久以前就放弃了Subcut,只选择了蛋糕模式。老实说,我不知道Bushlighti,但我会在有时间的时候看它。WRT cake pattern,我必须告诉你,你很容易爱上编译器告诉你你的组件的DEP是否满意。