【发布时间】: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