我正在尝试掌握DDD背后的想法,并将其应用于我们拥有的宠物项目,并且我有一些问题,希望这里的人能够回答。
该项目是一个文档管理系统。我们遇到的特定问题涉及系统处理的两个概念:aDocument
和a DocumentStatus
。
阿Document
具有的许多属性(如标题,作者,等等)的。用户可以在整个Document
生命周期内更改的任何属性。
一个Document
可能是,在任何时候,是在一个特定的状态,例如NEW
,UNDER_REVISION
,REVISED
,APPROVED
等等。对于每个国家,我们需要知道谁作出改变这种状态。
我们需要能够根据文档状态查询系统。示例查询将为“获取REVISED
状态中的所有文档”。
“获取用户X更改了状态的所有文档”
在同一事务中唯一需要更改aDocument
和DocumentStatus
需求的时间Document
是创建后(创建文档并同时将其状态分配为NEW
)。
对于所有其他时间,UI允许更新其中之一,但不能同时更新(即,您可以更改文档的属性,例如作者,但不能更改其状态。)或者您可以更新其状态(从NEW
到UNDER_REVISION
),但不能更新其属性。
我认为我们可以安全地认为aDocument
是实体和汇总根。
我们对什么感到震惊DocumentStatus
。一种选择是使其成为Document
集合中的Value Object的一部分。
另一种选择是使其成为实体并成为其自身集合的根。
我们还想提及的是,我们考虑了DDD文档中描述的CQRS,但是我们认为这太麻烦了,特别是考虑到我们需要在上执行查询DocumentStatus
。
任何指针或想法将受到欢迎。
您说您需要能够查看过去的状态更改,因此状态历史记录成为一个域概念。一个简单的解决方案如下:
StatusHistory
在Document
实体内定义一个。StatusHistory
列表列出了StatusUpdate
值对象。StatusHistory
始终中的第一个元素始终反映当前状态-确保StatusUpdate
在创建Document
实体时将初始状态添加为值对象。根据状态历史记录需要多少附加逻辑,请考虑为历史记录本身创建专用的值对象(甚至实体)。
您并没有真正说出持久层的外观,但是我认为StatusHistory
使用每种持久性机制都可以对列表的第一个元素创建查询。例如,使用map-reduce数据存储,创建一个由索引的视图,Document.StatusHistory[0]
并使用该视图实现所需的查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句