应用 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 的问题。
通过我对实施 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 的问题。