背景
我正在构建一个显示垂直项目列表的应用程序(想象一个文件浏览器应用程序)。项目类型可以是文件夹,在这种情况下,文件夹可以具有任意数量的子项目/文件夹,从而允许用户创建/导航层次结构,就像文件系统一样。用户可以手动拖放项目以按需要对其进行排序,而无需按字母顺序(等)排序。因此,每个项目都有一个整数类型的sort / position属性,该属性可跟踪该项目相对于当前文件夹中其他项目的位置。至少视图模型当前可以使用。
问题
该项目的sort / position属性是否属于该项目的域对象上的属性?
排序值本身对单个项目没有任何意义。这里的怪异概念是作为文件夹的项目的递归/分层性质。文件夹类型的项目可能负责确保直接子项的排序值有效(顺序/无空格/无重叠),并负责更改这些子项的排序顺序。
但这是正确的吗?排序顺序似乎与显示相关。相反,是否应该有一种服务,该服务采用无排序的域实体,并在将这些项转换为视图模型之前将其应用到它们,然后对它们应用排序/位置属性?
答案 0 :(得分:1)
集合是一致性边界。所有业务规则都应保留在该一致性范围内。将SortOrder放到Item Aggregate中将意味着您不能确保所声明的规则得到遵守,但是如果您松开规则,则可以不用将SortOrder放到这里。具体来说,如果您删除了SortOrder必须严格顺序的约束,那么您可以忍受空白。
如果将SortOrder放在Folder Aggregate中,则可以维护您建议的规则,但是那里也有成本吗?如果项目被删除或移动到其他文件夹怎么办?父文件夹如何获得通知?它如何反应?您是否删除项目并重新订购?
通过这种方式,答案取决于更有可能出现的情况,以及规则是否确实如您所说的那样,或者您是否出于简化实现的目的灵活运用它们。