Skip to content

实现命令

命令执行过程中可以调用另外一个命令吗?

可以。有的时候,一个命令的功能,可以分解为多个子功能,其中一些功能可以通过重用已有的命令实现,这当然是可以重用的。 类似下面的代码:

kotlin
class Sub1Cmd
class Sub1CmdHandler

class SubCmd2
class Sub2CmdHandler

class MyCmd
class MyCmdHandler(
  private val sub1CmdHandler: Sub1CmdHandler,
  private val sub2CmdHandler: Sub2CmdHandler
) {
  fun handle(cmd: MyCmd) {
    sum1CmdHandler.handle(makeSub1CmdFromMyCmd(cmd))
    sum2CmdHandler.handle(makeSub2CmdFromMyCmd(cmd))
  }
}

一个命令可以操作多个聚合吗?

可以。

一个命令执行过程中可以发出多个领域事件吗?

可以。

怎么实现批量处理?

首先,看如何给命令建模。如果批量处理里的多个处理之间是完全孤立的,批量处理和用户多次操作的效果在业务上完全一样,那么这个时候的“批量处理”,只是一种交互逻辑,并不是领域逻辑,没有必要为这种操作单独建立一个命令。反之,如果这些处理间存在业务约束,和用户一个一个操作是不同的,那么就应该单独建立一个命令来实现“批量处理”,因为不可能通过重用单个处理的命令来实现这个命令。

然后,根据模型来初步选择技术实现方案。如果每个命令只做单个处理,那么在领域模块外通过重复调用命令的方式来实现“批量”;否则,就在领域模块内实现。

最后,如果性能不够用,为了达到性能要求,需要做一些性能优化,比如提前预读取数据做缓存,异步处理以尽快给用户反馈进度,甚至是放弃使用领域模型,而是直接操作数据库。大部分情况下,即使是在外部循环的调用命令来实现批量处理,性能也是够用的。