如何在scala中进行依赖注入?


Answers:


61

标准Java DI框架通常可以与Scala一起使用,但是您也可以使用语言构造来实现相同的效果,而无需外部依赖。


该链接为我提供了很多示例的非常好的概述。非常感谢你。
Fabian 2010年

4
首先,这篇文章是我刚开始学习Scala时获得的最强烈的启发之一。
Daniel C. Sobral

我很好奇当服务或注册表可能需要不同数量的组件实例时,如何实现蛋糕模式。例如,如果链接示例中的WarmerComponentImpl需要一个OnOffDeviceComponent的两个不同实例来完成其工作,该怎么办?
米奇·布列文(Mitch Blevins)2010年

1
@MitchBlevins,看看Scala依赖注入指南中的“多个实现”部分。
adamw 2014年

有关如何在Scala中进行DI的一般概述。看看:blog.knoldus.com/2014/07/04/dependency-injection-scala
天空

15

Dick Wall的SubCut是专门针对Scala的新依赖注入库。

Dan Story的回答中引用的JonasBonér文章着重强调了编译时绑定实例和静态注入(通过混合),而SubCut基于不可变模块的运行时初始化和动态注入,即通过按类型,字符串名称,或scala.Symbol名称。

您可以在《入门指南》文档中了解有关与Cake模式进行比较的更多信息。


9

依赖注入本身可以在没有任何工具,框架或容器支持的情况下完成。您只需new要从代码中删除s并将它们移至构造函数即可。剩下的一个单调乏味的部分是在“世界尽头”对物体进行接线,在这种情况下容器可以提供很多帮助。

尽管使用Scala的2.10宏,您可以在编译时生成接线代码,并具有自动接线和类型安全性。

请参阅《Scala指南》中依赖注入


2
很少有人意识到这一点,因此我将其用作面试问题。
蒂姆·巴拉斯

2

最近的一个项目说明了一个纯粹基于构造函数注入的DI:zalando / grafter

构造函数注入又怎么了?

在Scala中有许多 方法可以进行依赖注入。通过使用构造函数注入,Grafter回到了依赖注入的基础知识:没有反射,没有xml,没有注释,没有继承或自类型。

然后,Grafter向构造函数注入添加了必要的支持:

  • 从配置实例化基于组件的应用程序
  • 微调布线(创建单例)
  • 通过更换组件来测试应用程序
  • 启动/停止应用

Grafter着眼于所有可能的应用,因为它专注于仅关联3个想法:

  • 组件的案例类和接口
  • 阅读器实例,无配置
  • 重写树和kiama进行其他操作!

1

我自己还没有这样做,但是大多数DI框架都在字节码级别(AFAIK)上工作,因此应该可以将它们与任何JVM语言一起使用。


2
在过去的几年中,我在Scala中成功使用的一种标准Java DI框架是PicoContainer。(并且您可以使用构造函数注入而不是setter注入来保持不变。)
Seth Tisue 2010年

Spring ME是一个依赖项注入框架,它使用源代码分析来实现Spring在运行时完成的大部分工作。结果,最终得到几乎零占用空间的应用程序上下文,而不依赖于任何外部库。不知道我是否会在Scala中使用它。
Wilfred Springer'3

1

先前的文章介绍了这些技术。我想添加一个链接到Martin Odersky在2014年5月关于Scala语言目标的演讲。他确定了“需要” DI容器以注入依赖关系的语言,这些语言实施得不好。我个人对此表示赞同,但这只是一个意见。似乎确实表明在Scala项目中包括DI依赖项是非习惯性的,但这再次是意见。实际上,即使使用旨在本机注入依赖关系的语言,使用容器也可以获得一定程度的一致性。出于您的目的,这两种观点都值得考虑。

https://youtu.be/ecekSCX3B4Q?t=1154


1

我建议您尝试转移(免责声明:我是作者)。

它可以让您做的比典型的DI还要多,并且具有许多独特的特征

  1. distage支持多种配置(例如,您可以使用不同的组件实现集来运行您的应用),
  2. distage使您可以在测试之间正确共享依赖关系,并可以针对组件的不同实现轻松运行相同的测试
  3. distage支持角色,因此您可以在同一个流程中运行多个服务,共享它们之间的依赖关系,
  4. distage不依赖scala-reflect (但支持Scala类型系统的所有必要功能,例如种类繁多的类型)。

您还可以在Functional Scala 2019上观看我们的演讲,我们讨论并演示了Distage的一些重要功能。



0

除了Dan Story的答案外,我在博客中还介绍了一个DI变体,该变体也仅使用语言构造,但在Jonas的文章“特质的价值注入”(现在链接到web.archive.org)中未提及。这种模式对我来说非常有效。


博客链接已死,您能否详细说明
sas1138 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.