在CQRS中为命令设置多个处理程序是否可以?

时间:2015-03-22 10:59:59

标签: cqrs

正如标题所说,在CQRS中为命令设置多个处理程序是否可以?查看简单的CQRS示例herethis 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");
    }
}

但是,我们有每个命令类型的处理程序列表,这让我更加困惑:)我猜这只是一个实现细节,在理想的世界,它应该没问题,但我想确定。

1 个答案:

答案 0 :(得分:4)

您应该只有一个命令的命令处理程序。发送命令以请求域中的更改。它们的实现可以类似于DTO,但它们不仅仅是传输数据。它们以抽象的方式提供通信。因此,如果有一个具有通用目的并且由许多命令处理程序处理的命令,则意味着该命令上存在单独的逻辑。这可能会在域中造成不一致。很难找到用于特定命令请求的处理程序。

当你为一个特定的命令处理程序更改(添加属性)命令时,该更改对其他命令处理程序毫无意义。这是不可取的。

如果您需要处理具有多个处理程序的一个命令的概念,请考虑CQRS中也提到的事件源。