聚合可以发出自己的命令吗?
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 处理,然后调用聚合上的方法来执行工作。聚合并不真正了解用例。
如果您将命令的概念与聚合的概念分开,那么您可以自由地以一种使您的域灵活的方式实现行为。您可以彼此独立地添加新的用例(命令)和新的行为(在您的聚合中)。
问题
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 处理,然后调用聚合上的方法来执行工作。聚合并不真正了解用例。
如果您将命令的概念与聚合的概念分开,那么您可以自由地以一种使您的域灵活的方式实现行为。您可以彼此独立地添加新的用例(命令)和新的行为(在您的聚合中)。