scala - 如何在提供默认API

时间:2016-12-07 13:30:28

标签: scala design-patterns

我想开发一个框架,用户可以在我们的平台中注入自己的代码,而不知道我们可能会在不久的将来改变的一些实现细节(例如数据库类型)。

我已将代码拆分为两个不同的项目:

  • 包含公共API的文件
  • 包含服务器端实现的文件

但是,我希望他们可以使用某种API的默认实现来测试他们的代码。

例如,在公开API

trait UserDatabase {
  def getAllUserInfo : List[UserInfo]
  ...
}

trait ExecutesOnServer{
  def doWhaterverYouWant(db <: UserDatabase ) : Unit
}

用户代码

class ExecutesOnServerImpl{
  @override def doWhaterverYouWant(db <: UserDatabase) : Unit {
    db.getAllUserInfo.foreach(println)
  }
}

现在位于私人实施

class MySQLUserDatabase extends UserDatabase {
  @override def getAllUserInfo : List[UserInfo] = mysql.query(...)
  ...
}

我希望用户能够访问一种类似LocalTextFileUserDatabase的默认impl来测试他们的代码,这将取代我服务器端的服务器端。

这样做的最佳方式是什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以根据当前环境注入不同的具体实现。例如,if SERVER_ENV == "local"您将创建LocalTextFileUserDatabase的实例,否则MySQLUserDatabase