通过研究我已经完成了实施CQRS / ES(我知道它们不一定相互关联),我还没有看到传递给命令的完整对象。
例如,为什么我不应该在错误跟踪API中接受 bug 的参数,如下所示:
[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));
然后在其他地方建造。
有具体原因吗?当然,我在这里遗漏了一些东西或做错了什么。
答案 0 :(得分:1)
假设Bug
是一个具有各种属性或字段的复杂类,这些自定义类型中的每一个都具有其他属性和字段等,您将在客户端上承担相当大的负担以提供整个对象图只是为了打开一个bug。
您可以在此处应用Postel's law:如果只需要打开错误,例如错误 ID ,则其他任何内容都会对客户端施加不必要的约束。您将使API更难使用。这不符合基于任务的UI 的CQRS理想。
在a white paper that sometimes can be hard to find on the internet中,Greg Young解释了在应用程序层之间来回传输大型DTO的问题。