正如标题所说,在CQRS中为命令设置多个处理程序是否可以?查看简单的CQRS示例here和this line让我感到困惑。
以下是代码:
public void Send<T>(T command) where T : Command
{
List<Action<Message>> handlers;
if (_routes.TryGetValue(typeof(T), out handlers))
{
if (handlers.Count != 1) throw new InvalidOperationException("cannot send to more than one handler");
handlers[0](command);
}
else
{
throw new InvalidOperationException("no handler registered");
}
}
但是,我们有每个命令类型的处理程序列表,这让我更加困惑:)我猜这只是一个实现细节,在理想的世界,它应该没问题,但我想确定。
答案 0 :(得分:4)
您应该只有一个命令的命令处理程序。发送命令以请求域中的更改。它们的实现可以类似于DTO,但它们不仅仅是传输数据。它们以抽象的方式提供通信。因此,如果有一个具有通用目的并且由许多命令处理程序处理的命令,则意味着该命令上存在单独的逻辑。这可能会在域中造成不一致。很难找到用于特定命令请求的处理程序。
当你为一个特定的命令处理程序更改(添加属性)命令时,该更改对其他命令处理程序毫无意义。这是不可取的。
如果您需要处理具有多个处理程序的一个命令的概念,请考虑CQRS中也提到的事件源。