【问题标题】:How to properly pass many dependencies (external APIs) to a class in Scala?如何正确地将许多依赖项(外部 API)传递给 Scala 中的类?
【发布时间】:2018-02-18 10:25:16
【问题描述】:

如何正确地将许多依赖项(外部 API)传递给 Scala 中的类?

我正在开发使用许多 API 来收集数据的应用程序。对于 API,我有trait,如下所示。

trait api {
  def url: Foo
  def parse: Bar
}

此外,api 特征大约有 10 个实现(每个 API 一个)。在父演员内部,我想为每个外部 API 创建一个子演员。我创建了新的特征和实现,

trait ExternalApis {
  val apiList: List[api]
}

object MyApis extends ExternalApis {
  val apiList = List(new ApiImpl1, ..., new ApiImpl10)
}

所以现在我可以将MyApis 对象(或ExternalApis 的任何其他实现)传递给父actor,并映射到apiList 以创建此类子actor。

在我看来,我错过了一些东西。还有更合适的方法吗?

【问题讨论】:

  • 我觉得不错。如果您需要更大的灵活性,您可以从配置文件或数据库中读取 api 实现列表,但这也会导致更高的复杂性。
  • 我看到的唯一问题是:你怎么知道向哪个 API 实现发送消息?我不知道你的整个代码库,如果这看起来是一个愚蠢的问题,我很抱歉!

标签: scala dependency-injection dependencies


【解决方案1】:

您所做的实现看起来几乎准备好了。我想补充的是:

  1. 传递 API 列表可能不是执行此类操作的最理想方式。每当您想向 API 列表添加/删除某些内容时,您都必须更改代码的不同区域。建议从配置文件夹中读取此内容,其中配置文件夹将包含诸如 url、用户名、密码等内容。

如果您能提供有关这些 API 使用的更多见解,这将对我的回答大有帮助。

希望这有帮助!

【讨论】:

  • 所有 API 均已开放并返回一些价格。我需要为每个 API 创建api trait 的实现,因为从每个 API 获取价格和外部信息的逻辑都非常不同。而且我看不出它应该如何在配置文件中完成。我应该创建类似apiList=[classpath1, .., classpath10] 的内容然后加载它吗?
  • 是的,这也是一个很好的实现。 url、用户名和密码的加载应该在配置文件中定义和加载。
猜你喜欢
  • 2021-04-06
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2021-01-02
  • 2017-04-05
  • 2011-12-05
  • 2019-07-26
  • 1970-01-01
相关资源
最近更新 更多