除了java之外,我还在开始学习scala而且我没有得到它如何应该在那里做DI?可以或者我应该使用现有的DI库,是手动完成还是其他方式?
答案 0 :(得分:59)
标准Java DI框架通常适用于Scala,但您也可以使用achieve the same effect的语言结构,而无需外部依赖。
答案 1 :(得分:14)
专门针对Scala的新依赖注入库是Dick Wall的SubCut。
虽然Dan Story的回答中引用的JonasBonér文章强调了编译时绑定实例和静态注入(通过混合),但SubCut基于不可变模块的运行时初始化,以及通过按类型查询绑定模块的动态注入,字符串名称或scala.Symbol名称。
您可以在GettingStarted文档中阅读有关与蛋糕模式进行比较的更多信息。
答案 2 :(得分:9)
依赖注入本身可以在没有任何工具,框架或容器支持的情况下完成。您只需要从代码中删除new
并将它们移动到构造函数中。剩下的一个单调乏味的部分是在“世界末日”对象进行连接,其中容器有很多帮助。
虽然使用Scala的2.10宏,但您可以在编译时生成接线代码并具有自动布线和类型安全性。
答案 3 :(得分:2)
最近的一个项目说明了一个完全基于构造函数注入的DI:zalando/grafter
构造函数注入又出了什么问题?
在Scala中执行many有libraries approaches或dependency injection。 Grafter通过使用构造函数注入回到依赖注入的基础:没有反射,没有xml,没有注释,没有继承或自我类型。
然后,Grafter为构造函数注入添加了必要的支持:
- 从配置
实例化基于组件的应用程序- 微调布线(创建单身)
- 通过更换组件来测试应用程序
- 启动/停止应用程序
Grafter针对每个可能的应用程序,因为它专注于仅关联3个想法:
- 组件的案例类和接口
- 阅读器实例和配置无形
- 树重写和kiama用于其他一切!
答案 4 :(得分:1)
我自己并没有这样做,但大多数DI框架都在字节码级别(AFAIK)工作,因此应该可以将它们与任何JVM语言一起使用。
答案 5 :(得分:1)
以前的帖子涵盖了这些技巧。我想添加链接到Martin Odersky 2014年5月关于Scala语言目标的演讲。他识别出需要"要求的语言。一个DI容器,用于注入依赖关系,因为实现不当。我个人同意这一点,但这只是一种意见。它似乎表明在您的Scala项目中包含DI依赖是非惯用的,但这也是意见。实际上,即使使用旨在本地注入依赖关系的语言,使用容器也会获得一定程度的一致性。为了您的目的,值得考虑这两种观点。
答案 6 :(得分:1)
我建议您尝试distage(免责声明:我是作者)。
它可以使您做的比典型的DI还要多,并且有很多unique traits:
scala-reflect
(但支持Scala类型系统的所有必要功能,例如
更高种类的类型。您还可以观看our talk at Functional Scala 2019,我们在这里讨论并演示了一些重要的转移能力。
答案 7 :(得分:0)
除了Dan Story的答案之外,我在博客上写了一个DI变体,它只使用了语言结构,但在Jonas的帖子中没有提及:Value Injection on Traits。 这种模式对我来说非常好。
答案 8 :(得分:0)
我已经展示了如何使用2.10 here.
在scala中创建一个非常简单的功能DI容器