gpt4 book ai didi

scala - 比较Subcut和Scaldi

转载 作者:行者123 更新时间:2023-12-03 12:52:29 24 4
gpt4 key购买 nike

我正在寻找在我的项目中使用的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com