我正在尝试将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的缺陷还是我做错了什么?
答案 0 :(得分:0)
我发现问题是使用符号作为绑定标识符。我使用BindingId
将它们换成了解决方案,一切正常:
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}})