聚合可以发出自己的命令吗?

Can an aggregate issue its own commands?

问题

AR 能否发出自己的命令,或者最好通过侦听外部命令发出的事件的处理器发出它们?

顺便说一句: 如果你认为这个问题可能会导致“主要是自以为是”的答案,我仍然想知道它是否被认为是一种好的做法,并且为什么。

PHP 代码示例

class PatchableComponent extends EventSourcedAggregateRoot
    implements Entity, ReconstitutableEventSourcedAggregateRoot
{
    ...

    public static function importFromCore(...): PatchableComponent
    {
        $patchableComponent = new self;

        $patchableComponent->applyPatchableComponentWasImportedFromCore(
            new PatchableComponentWasImportedFromCore(...)
        );

        // Here, the AR issue its own startLookingForPatches() command.
        $patchableComponent->startLookingForPatches();

        return $patchableComponent;
    }

    public function startLookingForPatches(): void
    {
        $this->applyPatchableComponentStartedLookingForPatches(
            new PatchableComponentStartedLookingForPatches(...)
        );
    }

    ...
}

Can an AR issue its own commands, or it is better to issue them through a processor that listen event emitted by the outer command?

聚合当然可以调用它自己的方法;添加额外的间接层通常是不必要或不可取的。

我知道这个问题有一个可接受的答案,但我想自己出 2 美分。

当您声明聚合正在发出命令时,您的代码示例实际上并没有这样做。您的示例是聚合执行特定行为的示例。 "Command" 的概念是封装用户意图(用例)的消息。命令通常(并且希望)由 CommandHandler 处理,然后调用聚合上的方法来执行工作。聚合并不真正了解用例。

如果您将命令的概念与聚合的概念分开,那么您可以自由地以一种使您的域灵活的方式实现行为。您可以彼此独立地添加新的用例(命令)和新的行为(在您的聚合中)。