在 CQRS 中一个命令有多个处理程序是否可以?
Is it OK to have more than one handler for a command in CQRS?
正如标题所说,在 CQRS 中一个命令有多个处理程序是否可以?查看简单的 CQRS 示例 here and 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");
}
}
但是,我们有每个命令类型的处理程序列表,这让我更加困惑 :) 我猜这只是一个实现细节,在理想世界中,它应该没问题,但我想确定一下。
一条命令应该只有一个命令处理程序。发送命令以请求更改域。它们的实现可以类似于 DTO,但它们不仅仅是传输数据。它们提供抽象的通信。因此,如果有一个命令具有通用目的并由许多命令处理程序处理,这意味着该命令有一个单独的逻辑。这会在域中造成不一致。很难找到用于特定命令请求的处理程序。
而且当您更改(添加 属性)一个特定命令处理程序的命令时,该更改对其他命令处理程序毫无意义。这是不希望的。
如果您需要一个概念,例如使用多个处理程序处理一个命令,请考虑 CQRS 中也提到的事件溯源。
正如标题所说,在 CQRS 中一个命令有多个处理程序是否可以?查看简单的 CQRS 示例 here and 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");
}
}
但是,我们有每个命令类型的处理程序列表,这让我更加困惑 :) 我猜这只是一个实现细节,在理想世界中,它应该没问题,但我想确定一下。
一条命令应该只有一个命令处理程序。发送命令以请求更改域。它们的实现可以类似于 DTO,但它们不仅仅是传输数据。它们提供抽象的通信。因此,如果有一个命令具有通用目的并由许多命令处理程序处理,这意味着该命令有一个单独的逻辑。这会在域中造成不一致。很难找到用于特定命令请求的处理程序。
而且当您更改(添加 属性)一个特定命令处理程序的命令时,该更改对其他命令处理程序毫无意义。这是不希望的。
如果您需要一个概念,例如使用多个处理程序处理一个命令,请考虑 CQRS 中也提到的事件溯源。