2

我的应用程序中的一些软件组件需要启动和关闭活动。

问题 1:在 Scala 中启动和停止此类“服务”的最佳实践是什么?

我在我的应用程序中使用依赖注入 (DI),我目前的理解是 DI声明了软件组件之间的依赖关系,但应该没有副作用(即,DI 机制不应该自行启动/停止服务)。所以 DI 与服务激活正交。

但是,似乎存在重叠:假设我的应用程序包含 a NotificationService,而后者又使用 a SchedulingService。所以我将调度服务实现注入到我的通知服务实现中,并手动启动和停止这些服务。但是,DI 框架手头有所有信息,可以知道哪些服务需要实例化(因此启动/停止)以及哪些取决于哪些服务(以及因此需要启动/停止服务的顺序)。因此,它可以提供启动/停止它们的方法,为我节省了一些样板代码!

问题2:他们是否尝试过扩展DI(例如Guice)来记录注入的服务并提供启动/停止它们的方法?

4

1 回答 1

1

在问题 1 中,依赖注入策略在 Java 中已经很成熟,而且这些通常可以直接转化为 Scala。然而,我认为 Scala 可以做得更好:它的主要构造函数非常适合基于构造函数的依赖注入,通常被认为是各种方法中最不混乱的(其他方法是 setter 注入、基于注解的注入等)。

在最近的一个项目中,我们最初使用 Spring,但改为采用少即是多的策略,完全放弃了 Spring。

  • 我们以测试驱动的 DI 面向对象的方式使用 Scala,几乎没有 XML(剩下web.xml的当然是 webapp 所必需的)。
  • 单个Bootstrap类使用必要的依赖注入以正确的顺序配置所有资源和服务。
  • Bootstrap当然是从web.xml.
  • 一切都进行了单元测试,除了Bootstrap而是通过集成测试进行测试。

给定一套组件,连接几个替代配置只需要编写不同的Bootstraps. 纯粹在 Scala 中执行此操作会在 IDE 中带来代码透明性和重构支持的巨大好处,而且工作量相对较小。

关于问题 2,我没有具体的答案。但我可以推荐一种少即是多的方法;如果只是不需要框架,那么这个问题可能就不那么重要了。

于 2013-03-23T14:26:01.253 回答