如何在DDD中为实体的当前状态建模

用户名

我正在尝试掌握DDD背后的想法,并将其应用于我们拥有的宠物项目,并且我有一些问题,希望这里的人能够回答。

该项目是一个文档管理系统。我们遇到的特定问题涉及系统处理的两个概念:aDocument和a DocumentStatus

Document具有的许多属性(如标题,作者,等等)的。用户可以在整个Document生命周期内更改的任何属性。

一个Document可能是,在任何时候,是在一个特定的状态,例如NEWUNDER_REVISIONREVISEDAPPROVED等等。对于每个国家,我们需要知道谁作出改变这种状态。

我们需要能够根据文档状态查询系统。示例查询将为“获取REVISED状态中的所有文档”。

“获取用户X更改了状态的所有文档”

在同一事务中唯一需要更改aDocumentDocumentStatus需求的时间Document是创建后(创建文档并同时将其状态分配为NEW)。

对于所有其他时间,UI允许更新其中之一,但不能同时更新(即,您可以更改文档的属性,例如作者,但不能更改其状态。)或者您可以更新其状态(从NEWUNDER_REVISION),但不能更新其属性。

我认为我们可以安全地认为aDocument是实体和汇总根。

我们对什么感到震惊DocumentStatus一种选择是使其成为Document集合中的Value Object的一部分

另一种选择是使其成为实体并成为其自身集合的根。

我们还想提及的是,我们考虑了DDD文档中描述的CQRS,但是我们认为这太麻烦了,特别是考虑到我们需要在上执行查询DocumentStatus

任何指针或想法将受到欢迎。

Dmi

您说您需要能够查看过去的状态更改,因此状态历史记录成为一个域概念。一个简单的解决方案如下:

  • StatusHistoryDocument实体定义一个
  • StatusHistory列表列出了StatusUpdate值对象。
  • StatusHistory始终中的第一个元素始终反映当前状态-确保StatusUpdate在创建Document实体将初始状态添加为值对象

根据状态历史记录需要多少附加逻辑,请考虑为历史记录本身创建专用的值对象(甚至实体)。

坚持不懈

您并没有真正说出持久层的外观,但是我认为StatusHistory使用每种持久性机制都可以列表的第一个元素创建查询例如,使用map-reduce数据存储,创建一个由索引的视图,Document.StatusHistory[0]并使用该视图实现所需的查询。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章