斯卡拉蛋糕模式和多项目

时间:2017-12-05 16:10:50

标签: scala dependency-injection

在普通项目中我有这个:

trait DBProvider
trait DBTableNamesProvider
trait DefaultDBProvider extends DBProvider
trait DefaultTableNames extends  DBTableNamesProvider

trait MyService extends DBProvider with DBTableNamesProvider

object MyService {
  def apply() = new MyService with DefaultDBProvider with DefaultTableNames {}
}

在我projectA作为jar的common-project引用我希望构建MyService

projectA(依赖于common-project):

object MyOtherApp {
  trait MyOtherTableName extends DBTableNamesProvider
  val MyCustomService = MyService() with MyOtherTableName // will not compile how to reuse the module's MyService() with another implementation of one of the traits?
}

以上不会编译我不能只调用MyService()构造并覆盖一些依赖项。

以上是我想要做的,我希望从一个不同的项目覆盖MyService()的工厂构造适用于我自己的MyProjectATableNames实现是否可能在scala?如果不是没有代码重复的推荐方法是什么?

2 个答案:

答案 0 :(得分:1)

 val MyCustomService = new MyService() with MyOtherTableName

应该有效

如果您还要继承DefaultDBProviderDefaultTableNames,则必须明确地列出它们:

val MyCustomService = new MyService() with MyOtherTableName with DefaultDBProvider with DefaultTableNames

或在公共库中创建一个中间特征:

trait DefaultService extends MyService with DefaultDBProvider with DefaultTableNames

答案 1 :(得分:0)

你不能覆盖那样的构造类型,因为MyService()不再是一个类型的对象了。因此,要重用代码,您可以创建类似

的类
class ConfiguredMyService extends DefaultDBProvider with DefaultTableNames

在第一个应用程序中,您可以声明

object MyService {
  def apply() = new ConfiguredMyService
}

并在第二个

val MyCustomService = new ConfiguredMyService with MyOtherTableName

注意:现在,Cake模式被认为是反模式,因此我建议您检查依赖注入。