Scala依赖注入用于单独配置的编译时间

时间:2013-12-26 09:40:34

标签: scala symfony dependency-injection

现在我首先意识到标题非常广泛,所以让我来描述用例。

背景:

我目前正在自学Scala + Gradle(因为我喜欢gradle的灵活性和强大功能以及更易读的构建文件)

因此,学习新语言通常最适合制作实际可以使用的应用程序,主要是PHP(使用Symfony)程序员和以前的Java程序员,这两种范例都有许多模式。

用例:

我正在编写一个应用程序,我正在尝试使用Provider + Interface(trait)布局,目标是定义包含任何特定类型组件的所有预期功能的特征,例如: ConfigReaderTraitYamlConfigReager作为提供者。理论上,这样做的好处是允许我以最小的努力切换核心机制甚至架构组件,这允许大量的R& D和实验。

PHP Symfony影响力

现在我作为纯PHP开发工作,因此已经引入Symfony,它有一个出色的依赖注入框架,其中依赖关系在yaml文件中定义,并且可以委托给子目录。我喜欢这个,因为与SBT不同,我不同的目的是使用不同的语言用于不同的目的(例如groovy with gradle for build scripts),我想保持关注点的分离。

这样每种类型的接口/特性或相关功能包都应该能够拥有自己的DI配置,我宁愿将它与scala代码本身分开。

现在为Scala ....

显然,不同语言之间的情况并不相同,如果你不接受这些差异,你可以回到以前的语言,并留下一些东西。

那就是说,我还不相信我看到的用于scala的DI框架。

  • 例如,Guice实际上是一个经过修改的java框架(很好 因为scala可以使用java库,但因为它们不起作用 感觉完全相同的编码语言范例 scala的功能没有被利用)。
  • MacWire让我恼火,因为你必须定义依赖项 在您使用它们的文件中。哪个对我不起作用 界面/提供者概念。
  • 到目前为止,SubCut似乎是最适合我的期望。

但是虽然经历了所有这些(并且考虑到这一切都处于研究阶段,我还没有使用它们中的任何一个)似乎Scala中的DI仍然非常分散,并且在它的初期,我意味着有不同的应用程序与不同的应用程序,但不是一个足够灵活或功率足以与Symfonys DI进行比较。特别是不适合我的申请。

评论?想法?

1 个答案:

答案 0 :(得分:1)

我的5美分:

在从Java切换到Scala之后,我实际上已经停止使用依赖注入框架了。

这种语言允许一些不用框架的好方法(多个参数列表和currying以及用于进行注入的mixin'蛋糕模式') 我发现自己越来越多地使用构造函数或基于方法参数的注入,因为它清楚地记录了给定逻辑片段的依赖关系以及从哪里获得这些依赖关系。

使用Scala object为实现创建不同的模块实现或工厂集,然后在运行时选择它们也相当容易。这将保证它不会编译,除非有可用的实现,而不是Java-land中的大型将在运行时失败,有效地将编译时问题推入运行时。

这也消除了如何创建和连接依赖关系的“魔力”(反射,运行时编织,宏,XML,绑定上下文到线程本地等)。我认为这使新开发人员更容易进入项目并理解代码库是如何互连的。

关于在像XML这样的非代码中声明实现,我发现项目很少或从不更改这些文件而不创建新版本,因此它们也可能是具有所带来的所有好处的代码(IDE支持,性能,类型检查)。

相关问题