Scala中的循环依赖

时间:2016-05-04 20:37:05

标签: scala circular-dependency

我有一个Scala项目A,它有一个接口(抽象类)I,它的实现,以及对项目B(B.jar)的引用。 A与publish-local打包在一起,编译成jar文件并存储在.ivy目录中。 反过来,项目B使用项目B中的I接口;它编译成一个jar并进入.ivy目录。

Scala中出现了一些设计问题:

  • 这是一个循环依赖,因为当B指A时,A指的是B?
  • 如果第一个问题是一个问题,我想简单的解决方案是从A中提取一个接口,使其成为另一个项目,由A和B引用。这样的项目是否只有一个项目一个界面?或者它只是可以,因为B只引用A中的一个类文件.Scala中的最佳实践是什么?

2 个答案:

答案 0 :(得分:2)

有时候所谓的循环依赖可以减少代码行,所以不能劝阻为“不好的做法”。事实上。 这一切都取决于项目的背景。 您需要回答诸如此类的问题

  1. 项目是否需要在不同的库中?
  2. 如果可以,我们可以考虑使用DI框架吗?例如Spring,Guice等
  3. 然后因为它是scala你实际上并不需要framework来实现它。

    考虑以下示例,

      class IdentityCard(val id: String, val manufacturerCompany: String, person: => Person)
      class Person(val firstName: String, val lastName: String, icard: => IdentityCard)
    
      lazy val iCard = new IdentityCard("123","XYZ",person)
      lazy val person:Person = new Person("som","bhattacharyya",iCard)
    

    这两个类可以放在不同的jar中,但仍然可以编译并使用较少的代码。 注意,我们正在使用按名称调用传入的依赖项。此外,我们正在对变量进行延迟初始化,因此在访问它们之前不会对它们进行求值。这允许我们forward-reference即。首先使用变量并稍后定义。

答案 1 :(得分:0)

如果没有更多具体细节,很难提供“最佳实践”建议。如果“项目B”与项目A紧密耦合,它们可能应该在同一个项目中,但在不同的子项目/子模块中。界面B使用也可以是它自己的子项目来删除圆圈。

sbt和maven支持这个,here's the sbt docs