1

我正在尝试将 Subcut 与我的依赖注入项目集成,并且遇到了将其与第三方库集成的问题。

该库需要加载我存储在 Play 配置中的文件的位置,并且我想使用 Subcut 注入该位置。以下是我当前定义的模块:

object ServerModule extends NewBindingModule (module => {
import module._ 

bind[String] idBy 'location toSingle {
  Play.current.configuration.getString("file.location").getOrElse (
    throw new IllegalStateException("Cannot find location")
  )
}

bind[ThirdPartyLib] toSingle {
  val location = inject [String] (Some('location.toString))
  ThirdPartyLib fromFile location
}

bind[Controller] toProvider { implicit module => new Controller}})

此代码编译但在运行时失败,说它找不到由 . 标识的位置字符串的绑定'location

另一件事我不明白为什么我可以做 idBy'location但这样做inject[T]('location)会导致编译失败?从代码来看,似乎idBy只是将符号转换为字符串,然后该inject方法只需要一个字符串。这只是 Subcut API 的缺陷还是我做错了什么?

4

1 回答 1

0

我发现问题是使用符号作为绑定标识符。我将它们换成使用BindingIds 的解决方案,一切正常:

object BindingKeys {
  object Location extends BindingId
}

object ServerModule extends NewBindingModule (module => {
  import module._
  import BindingKeys._

  bind[String] idBy Location toSingle {
    Play.current.configuration.getString("file.location").getOrElse (
      throw new IllegalStateException("Cannot find file")
    )
  }

  bind[ThirdPartyLib] toProvider { implicit module =>
      val libLocation = inject [String] (Some(Location))
      ThirdPartyLib fromFile libLocation
  }

  bind[Controller] toProvider { implicit module => new Controller}})
于 2014-12-23T20:39:49.360 回答