我正在看SubCut和Scaldi在我的项目中使用.各自的入门文档中提供的示例看起来非常相似.这两个项目似乎都没有提供Getting Started和scala docs 之外的文档.
有人可以总结这些框架之间的实际差异,主要是在特征和成熟度/稳定性方面.我正在研究这些包,因为我需要能够在运行时动态创建和组合配置.运行时配置是我查看这些库而不是使用implicits和/或层蛋糕模式进行DI /配置的主要原因,因此运行时配置工具对我来说是最重要的.另外我不认为编译器插件对我来说是一个选项,但是这两个库都可以在没有各自插件的情况下使用,而且冗长度只有很小的增加.我现在在scala-2.9.2上.
我也对直接在Scala中进行运行时DI /配置的建议感兴趣,但是将我的整个项目转换为monadic样式对我来说也不是一个选项.
我是Scala的新手,并且一直在努力学习和理解隐式转换和参数,并遇到了一个令我感到困惑的场景.
对于上下文,我使用Scaldi在Akka应用程序中执行依赖注入,并希望有多个可注入的actor从抽象类继承.我相信我无法使抽象类成为一个特征,因为我们需要Injector通过构造函数参数使隐式可用来利用框架.
展示我所看到的行为的一个非常人为的例子如下:
class SecretSauce {}
abstract class Base(implicit secretSauce: SecretSauce) {}
class Concrete extends Base {}
object Example extends App {
... // Setup Actor system, etc, etc
implicit val secretSauce: SecretSauce = new SecretSauce()
}
Run Code Online (Sandbox Code Playgroud)
我期待一些工作,但我得到一个编译错误:
Unspecified value parameter secretSauce.
class Concrete extends Base {
^
Run Code Online (Sandbox Code Playgroud)
如果我将隐式参数添加到具体类中,就像这样,事情可行:
class Concrete(implicit secretSauce: SecretSauce) extends Base {}
Run Code Online (Sandbox Code Playgroud)
我认为我的困惑源于隐式参数如何工作 - 在我所描述的情况下,它们是不是由子类继承的?有人可以ELI5在我的例子中发生了什么或指向我可以帮助清理的参考?
谢谢!
我现在正在一个使用Scaldi的项目中工作,我正在学习它,并且到目前为止看起来很好,但我仍然没有弄清楚它提供的指导/果汁的实际功能.
两个框架之间的实际差异是什么?
Scaldi更具功能性吗?
如果我从一个移动到另一个,我会失去/获得什么?
我想在我的play框架项目中使用Anorm作为DB库,将Scaldi作为DI.但是现在我无法注入数据库,因为在最新的游戏框架中,我们不能再使用DB.getConnection("datasource")了.
你们中的任何人都可以解释如何将NamedDatabase告知scaldi环境?
顺便说一句,这是我的代码snipet如何在Play scala中使用NamedDatabase.
class MembershipSqlStorage @Inject() (@NamedDatabase("membership") db: Database)
Run Code Online (Sandbox Code Playgroud)
它的工作原理.
谢谢