- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找在我的项目中使用的SubCut和Scaldi。它们各自的“入门”文档中提供的示例似乎非常相似。除了“入门”和scala文档之外,这两个项目似乎都没有提供文档。
有人可以主要在功能和成熟度/稳定性方面总结这些框架之间的实际差异。我正在研究这些软件包,因为我需要能够在运行时动态创建和组成配置。运行时配置是我查看这些库而不是使用隐式和/或层状蛋糕图案进行DI /配置的主要原因,因此运行时配置工具对我来说是最重要的。同样,我不认为编译器插件不是我的选择,但是这两个库都可以在没有它们各自的插件的情况下使用,而只是增加了一点点细节。我目前在scala-2.9.2上。
我也对直接在Scala中进行运行时DI /配置的建议感兴趣,但是将我的整个项目转换为monadic样式对我来说也不是一个选择。
最佳答案
通过介绍性文档,这两个库看起来可能非常相似,但是它们的实现方式却有很大差异。我想警告您,作为其中之一(scaldi)的作者,我可能无法做出公正的判断,因此您需要一言不发。
模块组成和依赖关系图
它们具有非常相似的DSL,用于绑定,注入以及将Injector
/ BindingModule
引入托管类范围的方式(尽管隐式参数)。
但是绑定的容器背后有不同的想法。例如,在Subcut中,一个类可以绑定(成为其他类的依赖项),也可以自己注入依赖项。但不是两个。如果要在当前绑定的类中注入某些内容,则需要显式提供一些BindingModule
作为参数。但是您不能泛型使用它,因为您当前的BindingModule
(定义绑定的位置)正在构建中并且尚不存在(您在其中定义绑定时实际上可以使用当前模块,但是此模块不知道由于没有任何形式的组合,因此,我没有找到实现此示例中跨模块依赖关系的任何好方法,例如:https://gist.github.com/OlegIlyenko/5623423),并且通常您不希望使用其他模块的具体实例。斯卡尔迪对这个问题的看法是非常不同的。 Module
中定义的每个绑定都是:可以注入其他绑定,并且本身可以注入其他依赖项。定义绑定时,隐式Injector
在模块内始终可用。该隐式注入器不仅代表您当前正在定义的模块,而且还了解最终的模块组成(如果您决定在某个时候创建它)。因此,您可以将应用程序分为几个模块,并且这些模块内的绑定之间可以具有依赖关系。
我个人认为,这是两个项目之间最大,最重要的区别。如果您仍然不确定这实际上意味着什么,那么我建议您尝试两个项目,然后您会很快注意到Subcut在这方面有多严格,以及scaldi的解决方案有多灵活。
灵活性
Scaldi是一个非常灵活的库,它使您几乎可以自定义其中的任何部分。通过使用类型类可以实现大部分这种灵活性。例如Identifier
特征。当涉及到绑定标识时,Subcut直接与字符串和类一起使用。因此inject
方法将String
作为参数,而您作为用户不能更改它。另一方面,Scaldi使用Identifier
特征,并且在大多数情况下不需要Identifier
,但是有证据表明对于要用作标识符的某些特定类型,存在CanBeIdentifier
类型类。因此,作为用户,您可以自定义要当作标识符的内容以及标识符之间的关系。绑定的类也是标识符,因此没有特殊情况。
相同的想法用于模块组合,该模块非常灵活,因为实际的组合是使用CanCompose
类型类进行的,这可以确保您总是从组合中获得最具体的Injector
类型(这在不可变的情况下非常重要)因此,如果您要将不可变的进样器与另一个不可变的进样器组成,您将收到ImmutableInjectorAggregation
。同样的情况也反映在库的其他部分,例如条件和进样器本身(我在下面介绍)。
条件绑定
scaldi天真地支持条件绑定,这是我在其他库中从未见过的。因此,您可以声明性地定义您的绑定是否可用以及何时可用。我发现在某些情况下(例如区分环境(dev / test / prod))非常有用。条件绑定使用类型类,因此它们也非常灵活。
动态
在我看来,Scaldi比Subcut更动态,主要是因为实现了Injector的方式。在Subcut注入器中只是绑定的集合。在scaldi中,它的接口具有类似getBinding
的方法。这意味着它不需要预先知道所有绑定。因此,与现有的DI框架(例如Spring或Guice)以及诸如属性文件之类的集成非常容易(实际上,Scaldi通过SystemPropertiesInjector
/ PropertiesInjector
开箱即用地提供了系统属性/属性文件支持,您可以将其与自己的模块组合在一起) 。
不变性
Scaldi在可变模块和不可变模块之间做出了很大的区分。可变模块具有更多功能,但也具有更大的动态性和出错率。不变模块的限制更为严格,但易于推理。通常,您可以选择。据我所知,Subcut仅具有一种风格,您可以在可变上下文中定义绑定,但是在完成定义之后,它是不可变的。
可能还有许多其他较小的差异,但是我希望我能够强调最重要的差异。再次提醒您,我只对scaldi有很好的了解,因此,我在此处描述的有关Subcut的一些事实和观察可能是不准确的,甚至是无效的。
希望这可以帮助。
关于scala - 比较Subcut和Scaldi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16646571/
我有一些 Scala 代码,它用两个不同版本的类型参数化函数做了一些漂亮的事情。我已经从我的应用程序中简化了很多,但最后我的代码充满了形式 w(f[Int],f[Double]) 的调用。哪里w()是
如果我在同一目录中有两个单独的未编译的 scala 文件: // hello.scala object hello { def world() = println("hello world") }
val schema = df.schema val x = df.flatMap(r => (0 until schema.length).map { idx => ((idx, r.g
环境: Play 2.3.0/Scala 2.11.1/IntelliJ 13.1 我使用 Typesafe Activator 1.2.1 用 Scala 2.11.1 创建一个新项目。项目创建好后
我只是想知道如何使用我自己的类扩展 Scala 控制台和“脚本”运行程序,以便我可以通过使用实际的 Scala 语言与其通信来实际使用我的代码?我应将 jar 放在哪里,以便无需临时配置即可从每个 S
我已经根据 README.md 文件安装了 ensime,但是,我在低级 ensime-server 缓冲区中出现以下错误: 信息: fatal error :scala.tools.nsc.Miss
我正在阅读《Scala 编程》一书。在书中,它说“一个函数文字被编译成一个类,当在运行时实例化时它是一个函数值”。并且它提到“函数值是对象,因此您可以根据需要将它们存储在变量中”。 所以我尝试检查函数
我有 hello world scala native 应用程序,想对此应用程序运行小型 scala 测试我使用通常的测试命令,但它抛出异常: NativeMain.scala object Nati
有few resources在网络上,在编写与代码模式匹配的 Scala 编译器插件方面很有指导意义,但这些对生成代码(构建符号树)没有帮助。我应该从哪里开始弄清楚如何做到这一点? (如果有比手动构建
我是 Scala 的新手。但是,我用 创建了一个中等大小的程序。斯卡拉 2.9.0 .现在我想使用一个仅适用于 的开源库斯卡拉 2.7.7 . 是吗可能 在我的 Scala 2.9.0 程序中使用这个
有没有办法在 Scala 2.11 中使用 scala-pickling? 我在 sonatype 存储库中尝试了唯一的 scala-pickling_2.11 工件,但它似乎不起作用。我收到消息:
这与命令行编译器选项无关。如何以编程方式获取代码内的 Scala 版本? 或者,Eclipse Scala 插件 v2 在哪里存储 scalac 的路径? 最佳答案 这无需访问 scala-compi
我正在阅读《Scala 编程》一书,并在第 6 章中的类 Rational 实现中遇到了一些问题。 这是我的 Rational 类的初始版本(基于本书) class Rational(numerato
我是 Scala 新手,我正在尝试开发一个使用自定义库的小项目。我在库内创建了一个mysql连接池。这是我的库的build.sbt organization := "com.learn" name :
我正在尝试运行一些 Scala 代码,只是暂时打印出“Hello”,但我希望在 SBT 项目中编译 Scala 代码之前运行 Scala 代码。我发现在 build.sbt 中有以下工作。 compi
Here链接到 maven Scala 插件使用。但没有提到它使用的究竟是什么 Scala 版本。我创建了具有以下配置的 Maven Scala 项目: org.scala-tools
我对 Scala 还很陌生,请多多包涵。我有一堆包裹在一个大数组中的 future 。 future 已经完成了查看几 TB 数据的辛勤工作,在我的应用程序结束时,我想总结上述 future 的所有结
我有一个 scala 宏,它依赖于通过包含其位置的静态字符串指定的任意 xml 文件。 def myMacro(path: String) = macro myMacroImpl def myMacr
这是我的功能: def sumOfSquaresOfOdd(in: Seq[Int]): Int = { in.filter(_%2==1).map(_*_).reduce(_+_) } 为什么我
这个问题在这里已经有了答案: Calculating the difference between two Java date instances (45 个答案) 关闭 5 年前。 所以我有一个这
我是一名优秀的程序员,十分优秀!