应用 CQRS/ES 时传递完整的对象

Passing around complete objects when applying CQRS/ES

通过我对实施 CQRS/ES 所做的研究(我知道它们不一定相互关联),我还没有看到将完整的对象传递给命令。

例如,为什么我不应该像这样在错误跟踪 API 中接收 错误 的参数:

[HttpPost]
public IActionResult CreateBug([FromBody] Bug bug)
{
    if (!ModelState.IsValid) {
        return new HttpStatusCodeResult(400);
    } else
    {
        commandHandler.Handle(new OpenBug(bug));

        return new HttpStatusCodeResult(201);
    }
}

其中OpenBug是命令:

public class OpenBug : ICommand
{
    public Guid Id { get; set; }
    public Models.Bug NewBug { get; set; }

    public OpenBug(Models.Bug bug) {
        Id = Guid.NewGuid();
        NewBug = bug;

        //Create BugOpened Event here (and add to event sequence?)
    }
}

据我所见,更多时候是这样处理的:

commandHandler.Handle(new OpenBug(bug.Description, bug.Fixed));

然后在别处建造。

这有什么具体原因吗?当然,我在这里遗漏了什么或者做错了什么。

假设 Bug 是一个复杂的 class,具有各种属性或字段,这些自定义类型中的每一个都具有其他属性和字段等,您会给客户端提供整个对象图只是为了打开一个错误。

您可以在此处应用 Postel's law:如果您需要打开一个错误,例如一个错误 ID,任何其他内容都会对客户端施加不必要的限制。您会使 API 更难使用。这不符合 基于任务的 UI.

的 CQRS 理想

a white paper that sometimes can be hard to find on the internet 中,Greg Young 解释了在应用程序层之间来回传输大 DTO 的问题。