如何在scala中进行dependency injection?
我还在开始学习除了java之外的scala,我没有得到它应该如何做DI? 可以或应该使用现有的DI库,是否应该手动完成还是有其他方法?
标准的Java DI框架通常和Scala一起工作,但是你也可以使用语言结构来实现相同的效果,而不需要外部依赖。
Dick Wall的SubCut专门用于Scala的新的dependency injection库。
而Dan Story的答案中引用的JonasBonér文章强调编译时绑定实例和静态注入(通过混合),SubCut基于不可变模块的运行时初始化,以及通过按types,string名称查询绑定模块的dynamic注入,或scala.Symbol名称。
您可以阅读更多关于与GettingStarted文档中Cake模式的比较。
dependency injection本身可以在没有任何工具,框架或容器支持的情况下完成。 你只需要从你的代码中删除new
s,并将它们移动到构造函数中。 剩下的一个单调乏味的部分就是在“世界末日”的对象上布线,在这里容器帮了很多忙。
尽pipe使用Scala的2.10macros,您可以在编译时生成接线代码,并具有自动接线和types安全性。
请参阅Scala指南中的dependency injection
我自己并没有这样做,但大多数DI框架都是在字节码级(AFAIK)上工作的,所以应该可以将它们与任何JVM语言一起使用。
最近的一个项目展示了一个纯粹基于构造器注入的DI: zalando / grafter
再次构造函数注入有什么问题?
有很多 库或方法在Scala中进行dependency injection 。 Grafter通过使用构造函数注入回到dependency injection的基础:没有reflection,没有XML,没有注释,没有inheritance或自我types。
然后,Grafter添加到构造器注入只是必要的支持:
- 从configuration中实例化一个基于组件的应用程序
- 微调布线(创build单身人士)
- 通过更换组件来testing应用程序
- 开始/停止应用程序
Grafter针对每个可能的应用程序,因为它专注于只关联3个想法:
- 案例类和组件的接口
- 阅读器实例和形状为configuration
- 树重写和凯马的一切!
除了Dan Story的回答之外,我还发表了一个DI变体,它也只使用了语言结构,但是在Jonas的文章中没有提到:特征值注入 。 这种模式对我来说工作得很好。
我已经展示了如何使用2.10在scala中创build一个非常简单的function性DI容器。
以前的post涵盖了技术。 我想添加一个链接到Martin Odersky 2014年5月关于Scala语言目标的讨论。 他确定了“需要”DI容器的语言,因为注入依赖性的执行效果不佳。 我个人同意,但这只是一个意见。 这似乎表明,在您的Scala项目中包含DI依赖项是非惯用的,但这也是意见。 实际上,即使使用一种旨在本地注入依赖关系的语言,使用容器也会获得一定程度的一致性。 为了您的目的,这是值得考虑的两个观点。