加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – 比较Subcut和Scaldi

发布时间:2020-12-16 09:38:46 所属栏目:安全 来源:网络整理
导读:我正在看SubCut和Scaldi在我的项目中使用。在他们各自的入门文档中提供的示例看起来非常相似。两个项目似乎都没有提供“入门”和scala文档之外的文档。 有人可以总结这些框架之间的实际差异,主要是在特征和成熟度/稳定性方面。我正在研究这些软件包,因为我
我正在看SubCut和Scaldi在我的项目中使用。在他们各自的入门文档中提供的示例看起来非常相似。两个项目似乎都没有提供“入门”和scala文档之外的文档。

有人可以总结这些框架之间的实际差异,主要是在特征和成熟度/稳定性方面。我正在研究这些软件包,因为我需要能够在运行时动态创建和组合配置。运行时配置是我正在查看这些库而不是使用implicits和/或图层饼图做DI /配置的主要原因,所以运行时配置设备对我来说最重要。另外我不认为编译器插件是我的选择,但是这两个库都可以使用,而没有他们各自的插件,只是稍微增加了详细程度。我目前在scala-2.9.2。

我也对在Scala中直接执行运行时DI /配置的建议感兴趣,但是将整个项目转换为单体风格也不是我的选择。

解决方法

通过评估介绍性文档,两个图书馆可能看起来都很相似,但它们在实现方式上有很大差异。我想提醒你,作为其中一个人(scaldi)的作者,我可能无法做出公正的判断,所以你需要用一粒盐拿我的话。

模块组成和依赖图

它们具有非常类似的DSL用于绑定,注入以及将Injector / BindingModule作为受管类的范围(尽管为隐式参数)的方式。

但是绑定的容器在它们之后有不同的想法。例如在Subcut中,一个类可以绑定(作为其他类的依赖)或者注入依赖关系本身。但不是两者。如果你想在你当前绑定的类中注入一些东西,那么你需要明确地提供一些BindingModule作为参数。但是您不能一般地使用它,因为您当前的BindingModule(您正在定义绑定的位置)正在构建中并且尚不存在(当您在其中定义绑定时,您可以实际使用当前模块,但是该模块不知道任何所以我没有找到任何实现跨模块依赖关系的好方法,如下例:https://gist.github.com/OlegIlyenko/5623423),通常不想使用其他模块的具体实例。 Scaldi承担这个问题是非常不同的。在模块中定义的每个绑定都是:可以注入其他绑定,并且本身可以注入其他依赖关系。当您定义绑定时,隐式注射器始终在模块中可用。这个隐式注入不仅代表您正在定义的模块,而且还意识到最终的模块组合(如果您决定在某个时候创建??它)。因此,您可以在几个模块中分离应用程序,并且这些模块中的绑定可以相互依赖。

我个人认为,这是两个项目之间最大和最重要的区别。如果您仍然不确定这几乎意味着什么,那么我可以推荐您尝试这两个项目,您将很快注意到在这方面Subcut有多严格限制,以及如何灵活的scaldi解决方案。

灵活性

Scaldi是非常灵活的库,它允许您定制几乎任何部分。大多数这种灵活性通过类型类的使用来实现。例如标识符特征。当涉及绑定的标识时,Subcut直接与字符串和类一起工作。所以注入方法使用String作为参数,你作为用户不能改变它。另一方面,Scaldi使用标识符特征,而在大多数情况下,不需要标识符,但证据表明CanBeIdentifier类型类对于要用作标识符的特定类型存在。所以,作为用户,您可以自定义您对待的标识符以及标识符如何相互关联。绑定的类也是标识符,因此没有特殊情况。

同样的想法被用于模块组合,这是非常灵活的,因为实际的组合是用CanCompose类型的类来确定的,你总是在组合中收到最具体的注射器类型(这在不可变注入器的情况下很重要,所以如果你想用另外一个不可变的进样器组成不可变的进样器,你会收到ImmutableInjectorAggregation)。图书馆的其他部分也反映在条件和注射器本身(我在下面描述)。

条件绑定

条件绑定是由scaldi天真支持的,它是我在其他库中没有看到的东西。所以你可以声明性地定义你的绑定是否可用,何时。在某些情况下,如区分环境(dev / test / prod),我发现它非常有用。条件绑定使用类型类,因此它们也非常灵活。

动态

从我的角度来看,Scaldi比Subcut更具活力,主要是因为Injector的实现方式。在Subcut注入器中只是绑定的集合。在scaldi中,它的界面具有getBinding等方法。这意味着它不需要先前知道所有绑定。因此,与现有的DI框架(如Spring或Guice)以及属性文件等集成非常简单(实际上Scaldi可以使用SystemPropertiesInjector / PropertiesInjector提供系统属性/属性文件支持,您可以使用自己的模块来组合)。

不变性

Scaldi在可变模块和不可变模块之间做出了很大的区别。可变模块具有更多的功能,但也更具动态性和容易出错。不可变模块更具限制性,但使其容易理解。你通常有选择。据我所知,Subcut只有一种风格,您可以在可变的上下文中定义绑定,但是在完成定义之后,它是不可变的。

可能有许多其他较小的差异,但我希望能够突出显示最重要的。只是想再次提醒你,我只对scaldi有很好的洞察力,所以我在这里描述的一些关于Subcut的事实和观察可能是不准确的,甚至是无效的。

希望这可以帮助。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读