文档管理模型 - 保护不变量

时间:2016-07-13 23:36:07

标签: c# oop domain-driven-design

我正在创建一个轻量级文档管理系统,并具有以下要求。

  • 用户可以上传具有已定义友好名称的文档
  • 文档必须遵循XX.YY.ZZ版本编号方案
  • 的修订历史记录
  • 版本号必须是连续的,不能在文档中重复。
  • 当需要路由文档以进行审批时,不允许对文档进行修订

因此,我需要强制执行的两个不变量是版本编号,并在等待批准时锁定文档。

我在Document和DocumentVersion两个sepreate聚合根之间或让Document成为具有文档版本集合(历史)的根之间。唯一让我认为它们是两个单独的聚合根源的因素是文档版本的批准过程。批准者不需要整个历史记录,只需要文档版本本身。

想法?

2 个答案:

答案 0 :(得分:2)

  

想法?

立即反应是您需要更好地了解域模型。这套"要求"看起来更像某人对事情应该如何实施的猜测,而不是对业务需求的描述。

  

因此,我需要强制执行的两个不变量是版本编号,并在等待批准时锁定文档。

不一定 - 根据您描述的要求,您不需要锁定文档,您需要将修订锁定到其内容。

换句话说,深入挖掘; "文件"试图做太多不同的事情",你的域名语言中有你不会使用的名词。

作者编辑草稿。 (对实体生命周期草案的讨论已经废除。)令人满意的草案可以提交其内容的版本以供批准。批准的提交内容将作为文档修订版发布....

换句话说,编辑过程和提交过程都有一些状态,也就是说隐藏在其中的不可变值类型,由负责它的实体不时替换。通过将状态而不是实体从一个进程移动到下一个进程来保留不变量。

  

唯一能让我认为它们是两个单独的聚合根源的原因是因为文档版本的批准过程。批准者不需要整个历史记录,只需要文档版本本身。

识别此冲突的全部观点 - 它是当前模型缺少一个或多个重要创意的重要线索。

批准期间没有修改"要求是一个很大的线索,即被批准的州需要与跟踪修订过程的实体不同的家。没有变化强烈暗示状态,因此价值对象;实体不是令人满意的国家代理人,因为它们的可变性。

答案 1 :(得分:1)

我最近建立了一个与此非常相似的系统,我们有了草案的概念。每次保存操作都会导致草稿的递增版本复制整个状态。即不可变的版本草稿。

然后我们有了一个已发布版本的概念 - 这与你批准的概念相同,因为它是'这个版本的草案现在正成为外界可以使用的东西'。我们再次将整个州复制到此事件中。我们本来可以从已发布的版本中获得指向草稿的指针,因为草稿无论如何都是不可变的,但决定复制状态 - 简单和存储空间之间的交易。

我们只是将这些事物视为事件,因此每个聚合都会有一个流,并且对于PublishedVersion的主流有一个投影 - 默认情况下我们在UI中加载了最新发布的版本。