【问题标题】:scala - How to separate public API from implementation while providing a default onescala - 如何在提供默认 API 的同时将公共 API 与实现分开
【发布时间】:2016-12-07 13:30:27
【问题描述】:

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

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

  • 包含公共 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 来测试他们的代码,这被替换为我在服务器上的服务器端。

最好的方法是什么?

感谢您的帮助

【问题讨论】:

  • 依赖注入?喜欢guicemacwire
  • @Odomontois 感谢您的帮助,我想尽可能避免使用第三方库。我不知道是否有任何设计模式可以解决这个问题。
  • @ogen 是的,使用 Scala,您可以通过实现 cake pattern 在没有任何第三方库的情况下进行 DI

标签: scala design-patterns


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2014-01-12
    • 2020-11-18
    相关资源
    最近更新 更多