- 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 为 Android 编写游戏。现在我正在尝试让 Dick Wall 的新依赖注入(inject)框架 SubCut 在 Android 上运行。 基本上我有一个扩展 andro
我是一名优秀的程序员,十分优秀!