我正在努力掌握DDD背后的想法并将它们应用到我们拥有的宠物项目中,我有一些问题,我希望这里的某个人能够回答.
该项目是一个文件管理系统.我们遇到的特殊问题是我们的系统处理的两个概念:a Document
和a的概念DocumentStatus
.
A Document
有许多属性(例如标题,作者等).用户可以Document
在其生命周期内更改任何属性.
一个Document
可能是,在任何时候,是在一个特定的状态,例如NEW
,UNDER_REVISION
,REVISED
,APPROVED
等等.对于每个我们需要知道谁作出修改,以该国国家.
我们需要能够根据文档状态查询系统.示例查询将是"获取REVISED
状态中的所有文档".
"获取用户X已更改其状态的所有文档"
在同一事务中a Document
和a DocumentStatus
需要更改的唯一时间Document
是创建(创建文档并同时为其分配状态NEW
).
对于所有其他时间,该UI允许无论是更新而不是两个(即你可以更改文件的属性,如作者,而不是它的状态.),也可以更新其状态(从NEW
到UNDER_REVISION
),而不是它的属性.
我认为我们可以安全地认为a Document
是实体和聚合根.
我们被重温了DocumentStatus
.一种选择是使其成为Document
聚合的值对象部分.
另一种选择是使其成为实体并成为其自身聚合的根.
我们还想提及我们在各种DDD文档中描述的CQRS,但我们认为这太麻烦了,特别是考虑到我们需要对其执行查询DocumentStatus
.
任何指针或想法都会受到欢迎.
您说您需要能够查看过去的状态更改,因此状态历史记录将成为域概念.那么一个简单的解决方案如下:
StatusHistory
在Document
实体内定义一个.
这StatusHistory
是一个StatusUpdate
值对象列表.
StatusHistory
始终反映当前状态的第一个元素- 确保StatusUpdate
在创建Document
实体时将初始状态添加为值对象.
根据状态历史记录需要多少额外逻辑,请考虑为历史记录本身创建专用值对象(甚至实体).
您并没有真正说出持久层的外观,但我认为StatusHistory
应该可以使用每个持久性机制创建针对列表的第一个元素的查询.例如,使用map-reduce数据存储创建一个索引的视图,Document.StatusHistory[0]
并使用该视图来实现所需的查询.