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是否满意。