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

时间:2010-04-01 21:51:36

标签: scala dependency-injection

除了java之外,我还在开始学习scala而且我没有得到它如何应该在那里做DI?可以或者我应该使用现有的DI库,是手动完成还是其他方式?

9 个答案:

答案 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宏,但您可以在编译时生成接线代码并具有自动布线和类型安全性。

请参阅Dependency Injection in Scala Guide

答案 3 :(得分:2)

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

  

构造函数注入又出了什么问题?

     

在Scala中执行manylibraries approachesdependency injection。 Grafter通过使用构造函数注入回到依赖注入的基础:没有反射,没有xml,没有注释,没有继承或自我类型。

     

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

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

Grafter针对每个可能的应用程序,因为它专注于仅关联3个想法:

     
      
  • 组件的案例类和接口
  •   
  • 阅读器实例和配置无形
  •   
  • 树重写和kiama用于其他一切!
  •   

答案 4 :(得分:1)

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

答案 5 :(得分:1)

以前的帖子涵盖了这些技巧。我想添加链接到Martin Odersky 2014年5月关于Scala语言目标的演讲。他识别出需要"要求的语言。一个DI容器,用于注入依赖关系,因为实现不当。我个人同意这一点,但这只是一种意见。它似乎表明在您的Scala项目中包含DI依赖是非惯用的,但这也是意见。实际上,即使使用旨在本地注入依赖关系的语言,使用容器也会获得一定程度的一致性。为了您的目的,值得考虑这两种观点。

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

答案 6 :(得分:1)

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

它可以使您做的比典型的DI还要多,并且有很多unique traits

  1. distage支持多种配置(例如,您可以运行您的应用 带有不同组的组件实现),
  2. distage允许您在测试之间正确共享依赖项 并轻松运行您的same tests for different implementations 组件
  3. distage支持roles,因此您可以在同一进程内运行多个服务,共享它们之间的依赖关系,
  4. 距离不取决于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容器