使用Scala实现跨一系列基于java的服务的域层

使用Scala实现跨一系列基于java的服务的域层,java,scala,design-patterns,architecture,Java,Scala,Design Patterns,Architecture,我们有一个java系统,它是在几个层次上实现的。在最低级别上,有些服务抽象了一系列基础设施组件,如数据库、blob存储、处理队列等。。。除此之外,我们还有域层,它实现了使用一个或多个服务(使用命令和复合命令模式)的工作流。最后,在该层之上还有一个基于jax-rs(jersey)的层,它提供了一个根据域层的工作流实现的REST接口/协议 我对Scala的经验是有限的,但我怀疑它可能是编写更具表现力的域层版本的好工具,因为Java代码非常冗长,有时很难调试。部分原因是命令合成和执行的控制由基类处理,

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

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


我希望这个非常高层次的描述能够说明我试图实现的目标。如果我需要更具体的信息,请告诉我。我最感兴趣的是如何使用Scala构建域层,同时保持基于Java的服务层。此外,关于如何在域层之上实现http/REST协议以便将其部署到java web应用程序容器中的建议也非常有趣。

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

trait CommandType1 { def operation() }
然后,就可以根据以下特征构建您的命令组合:

case class CompositeCommand(commandOperand: CommandType1*) extends CommandType1 {
  def operation() = commandOperand foreach { _.operation() }
}
Scala相对于Java在工作流层的另一个优势是,您可以将命令定义为可通过的函数。这打开了创建表示抽象操作的通用高级命令的可能性,然后为常用/访问的工作流创建和存储这些命令的部分功能


面向前端的Scala协议层可以考虑旋转参与者来处理传入的请求。此外,提供DI来控制您的业务逻辑,以及在前端代码中动态调度的多种方法,可能值得一看。

关于不同实现的一些想法,我建议您看看如何在Scala中以不同方式实现一些更常见的设计模式。一个好的起点是