【问题标题】:Using Scala to implement a domain layer spanning a range of java based services使用 Scala 实现跨越一系列基于 Java 的服务的域层
【发布时间】:2012-09-07 09:14:43
【问题描述】:

我们有一个在多个层中实现的 java 系统。在最低级别,有一些服务抽象了一系列基础设施组件,例如数据库、blob 存储、处理队列等......最重要的是,我们有实现使用其中一个或多个的工作流的域层服务(使用命令和复合命令模式)。最后还有一个基于 jax-rs (jersey) 的层,它提供了根据领域层的工作流实现的 REST 接口/协议。

我在 Scala 方面的经验有限,但我怀疑它可能是编写更具表现力的领域层版本的好工具,因为 Java 代码非常冗长且有时难以调试。部分原因是命令组合和执行的控制是由由具体命令扩展的基类处理的。事后看来,这可能不是一个理想的设计选择。

我希望这个非常高级的描述能够说明我正在努力实现的目标。让我知道是否需要更具体。我最感兴趣的是如何在 Scala 中构建领域层,同时保留基于 Java 的服务层。此外,关于如何在域层之上实现 http/REST 协议以便可以将其部署在 java Web 应用程序容器中的建议也将非常有趣。

【问题讨论】:

标签: java scala design-patterns architecture


【解决方案1】:

从战术上讲,一个明显的起点是利用 Scala 的结构类型并将您的命令表示为特征:

trait CommandType1 { def operation() }

然后可以根据这些特征构建您的命令组合:

case class CompositeCommand(commandOperand: CommandType1*) extends CommandType1 {
  def operation() = commandOperand foreach { _.operation() }
}

Scala 在您的工作流层上相对于 Java 的另一个优势是您可以将命令定义为可传递的函数。这开启了创建表示抽象操作的通用高级命令的可能性,然后为您常用/访问的工作流创建和存储这些命令的部分功能。

面向前端的 Scala 协议层可以着眼于启动 Actor 来处理传入的请求。此外,可能值得关注 Scala's Cake Pattern 之类的东西,以提供 DI 来控制您的业务逻辑,并在前端代码中提供用于动态调度的多方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多