【问题标题】:CQRS/ES Update Aggregate CommandCQRS/ES 更新聚合命令
【发布时间】:2014-07-06 17:33:20
【问题描述】:

我目前正在替换应用程序的域层,但必须保留现有的 MVVM UI。我们当然想要一个事件存储,但我在当前 CQRS 实施的某些方面遇到了困难。

我们有一些包含多个实体集合和键/值对动态属性的复杂聚合。我们现有的 UI 有一个用于此聚合的大型编辑屏幕,我不确定如何构建更新的命令。

可能的解决方案: 1) 只需在 ViewModel 中获取聚合,针对域模型执行更新,然后使用命令 (var command = new SaveAggregateCommand(myAggregate);) 发送它。这感觉不对,因为如果跨序列化边界(没有自定义序列化)发送内部事件,则不会保留内部事件。

2) 创建一个复杂的命令对象,其中包含一个更新属性列表以及每个集合类型的添加、更新和删除子实体的单独列表。这对于命令处理程序来说是最容易使用的,但感觉很草率。

3) 创建许多命令,这些命令基本上反映了被捕获的域模型事件(在我的场景中最多有 38 个)。然后,视图模型必须保留在用户按下保存按钮时提交的未提交命令列表。和 #2 一样,这也让人感觉很老套。

由于这种聚合的(必要的)复杂性,这些解决方案都没有感觉是正确的。我会为此提供一些指导。

【问题讨论】:

  • 这听起来像是一个超大的聚合体。你能告诉我们更多关于AR的信息吗?你为什么选择ES?在这种情况下捕获意图是一个 PITA,你能改变 UI 吗?
  • 更改 UI 必须稍后进行。这是一个商业决定。 AR 中的一切都需要在那里。真的不能再拆了。
  • 您可以使用一个大命令,并在应用层逆向工程意图。
  • 因此,有比执行 CRUD 更新的命令更多的命令。那些将是分开的。我遇到的问题是我需要一个事件流来跟踪对大量数据的修改,这些数据同时保存在旧版 UI 中。
  • 在查看并构建了各种命令之后,事情并没有我想象的那么大和复杂。我最大的命令只有 13 个属性。感谢您的意见!

标签: domain-driven-design cqrs event-sourcing


【解决方案1】:

所以,答案是:我做错了。命令被分解成更易于管理和更具体的部分,农民们很高兴。

【讨论】:

  • 你的聚合被分解了吗?所有这些命令都在同一个聚合上运行吗?
  • 是的,超级聚合被拆分为 3 个聚合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2017-05-12
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多