文档管理模型 - 保护不变量
本文关键字:保护 不变量 模型 管理 文档 | 更新日期: 2023-09-27 17:56:47
我正在创建一个轻量级的文档管理系统,并有以下要求。
- 用户可以上传具有定义的友好名称的文档
- 文档必须维护 XX.YY 之后的修订历史记录。ZZ 版本编号方案
- 版本号必须是连续的,并且不能在文档中重复。
- 当需要传送文档以供审批时,不允许对文档进行修订
因此,我需要强制执行的两个不变量是版本编号和在等待批准时锁定文档。
我在让文档和文档版本两个单独的聚合根或让文档成为具有文档版本集合(历史记录)的根之间左右为难。唯一让我认为它们是两个独立的聚合根是因为文档版本的审批过程。审批者不需要整个历史记录,只需要文档版本本身。
思潮?
思潮?
直接的反应是,您需要更好地了解域模型。 这组"需求"看起来更像是某人对应该如何实现的猜测,而不是对业务需求的描述。
因此,我需要强制执行的两个不变量是版本编号和在等待批准时锁定文档。
不一定 - 根据您描述的要求,您不需要锁定文档,您需要锁定其内容的修订。
换句话说,深入挖掘;"文档"试图成为太多不同的东西",您的域语言中包含您尚未使用的名词。
作者编辑草稿。(省略了对草案实体生命周期的讨论。令人满意的草案可以提交其内容版本以供批准。 已批准的提交将作为文档的修订版发布。
换句话说,编辑过程和提交过程都有某种状态,也就是说,隐藏在其中的不可变值类型,不时被负责它的实体替换。 通过将状态(而不是实体)从一个进程移动到下一个进程来保留不变性。
唯一让我认为它们是两个独立的聚合根的原因是文档版本的审批过程。 审批者不需要整个历史记录,只需要文档版本本身。
识别这种冲突的满分 - 这是当前模型缺少一个或多个重要想法的重要线索。
"批准期间不进行修订"的要求是一个重要线索,表明被批准的州需要与跟踪修订过程的实体不同的家。 没有变化强烈地暗示状态,因此价值对象;实体不是令人满意的状态替代品,因为它们具有可变性。
我最近构建了一个与此非常相似的系统,我们有了草稿的概念。每次保存操作都会产生复制整个状态的草稿的递增版本。即不可变的版本化草稿。
然后我们有了已发布版本的概念 - 这与您批准的概念相同,因为它是"此版本的草案现在正在成为外部世界可以使用的东西"。我们再次将整个状态复制到此事件中。我们本可以只有一个指向已发布版本中的草稿的指针,因为草稿无论如何都是不可变的,但决定复制状态 - 简单性和存储空间之间的交易。
我们只是将这些内容视为事件,因此每个聚合都有一个流,其中投影了已发布版本的主流 - 默认情况下,我们在 UI 中加载了最新的已发布版本。