DDD /聚合根/版本控制

时间:2017-03-07 16:18:29

标签: domain-driven-design versioning aggregateroot

我们通常如何处理聚合根的版本控制?

我正在考虑这条线(我在调查设计领域)。

进行版本控制的一种方法是使用显式方法基于现有版本创建新版本。例如,Study(聚合根)。

所以最初我们有一个聚合根,其根实体是Study with(business)key" ABC",version" 1"。

通过调用方法" newVersion()"在研究中,将创建该研究的所有其他属于同一聚合根的实体。

基本上,版本控制是通过创建一个单独的实例(聚合根)来完成的。 ID是复合的(业务键+版本)。

我们如何知道它是否是一个分支?或者只是一个版本? (1.1?或2)。我想,这个简单的规则是有效的:如果没有关联的其他版本,那么它就会出现一个版本" (2);如果已经是另一个版本,那么它就是一个分支(1.1)。

另一个问题:噪音。

但这意味着,我们无法处理/修改现有版本。每次我们想要修改对象时,我们都必须创建一个newVersion。每次???嗯....听起来不对。

或者......我们可以根据标志(主动/非主动,或发布/未发布)制定这样的规则。如果该标志是"不活动",我们可以直接修改AR,而无需创建新版本。如果该标志处于活动状态,我们必须:(a)将其设置为" not-active"首先,修改....或(b)创建一个newVersion并处理该版本(最初设置为" not-active")。

您想就此事分享任何想法/经验吗?

1 个答案:

答案 0 :(得分:3)

我认为你会发现在研究这个问题时会有些混乱,因为有两个非常不同的概念在起作用:

  • 版本控制作为支持乐观并发的并发控制机制
  • 版本控制作为显式域概念

支持乐观并发的版本控制

乐观并发是指允许两个同时发生的事务启动,但如果它们都尝试修改同一个数据项,则只允许第一个事务继续进行。有关不同锁定策略的概述,请参阅Concurrency Control

总之,您可以将版本控制留给持久性技术,因为版本的目的是检测对持久层的同时写入。

使用此模式时,通常不会保留旧版本的副本,但是作为审计跟踪/更改日志,它当然可以这样做。

版本控制作为显式域概念

根据您的问题以及支持潜在分支策略的需要,听起来版本化是您域中的一个明确的域概念 - 即版本"版本"是您的领域专家所谈论的内容,使用版本是无处不在的语言的重要组成部分。

但是,您提出了一些不同的概念,表明域需要进一步探索:

  • 版本分支
  • 用户定义的版本命名/标记(但仍然连接到'版本链)
  • 显式版本更改(用户请求)与隐式版本更改(每次更改时自动更改)
    • 如果我通过明确的版本控制正确理解您的意图,那么当前的活动' /'直播'提示'版本是可变的,可以修改而无需跟踪更改,直到用户提交'它 - 它变得一成不变,一个新的'生活'创建了可变的版本。

如果您探索此版本,可能会出现一些其他概念:

  • 分支合并(一旦你拆分了两个分支,如果你想把它们重新组合起来会发生什么?)
  • 回滚 - 如果你有一个旧版本,你支持'撤消'一个或多个变化?

鉴于上述情况,您还可以从版本控制系统集中(例如subversion)和分布式(例如gitmercurial)的工作方式中找到一些见解,因为它们提出了一个活跃的版本跟踪工作模型,其中包含可变元素和不可变元素的混合。

这里的开放式问题告诉我,您需要与域专家更详细地探讨这一点。使用DDD有时很容易迷失在可以做的事情中,但我强烈建议您尝试理解您需要做什么。

您的用户/域名专家如何看待这个世界?他们希望能做什么样的操作?这些行动的初始目标是什么目的?您的目标是将这些问题的答案提炼成一个模型,该模型有效地封装了他们使用的流程。

编辑以考虑建模

根据您的评论 - 我的第一反应是挑战对“'版本”这个词的解释。在考虑修改后的问卷时。事实上,我很想挑战模板/调查关系的建模。考虑一组可能的实体:

  • 模板

    • 在问卷中定义一组问题
    • 支持运营:
      • StartSurvey
      • 修改模板中的问题和选项的各种操作等。
  • 调查

    • 而不是引用“现场直播”。模板,调查将拥有自己的调查问卷
    • 当您调用Template.StartSurvey时,它会返回一个预先填入模板中问题列表的调查
    • 调查还支持修改问题 - 但这并不会改变其创建的模板
    • 与模板不同,调查还会维护已记录答案的列表,并提供设置答案的操作
    • 它可能还包括一个生命周期状态,其中在某些州允许回答问题,但一旦提交了“#li;你不能修改答案(只是猜测这个答案)。

在这个世界上,调查已经被删除了。从模板,但然后过一个独立的生活。您可以随意修改调查中的调查问卷,但不会影响模板。

这里的权衡是,如果你修改模板,那么从中创建的调查都不会得到更新 - 但听起来这对你来说可能更安全吗?

您还可以支持将调查转换回模板的操作,这样,如果您喜欢修改过调查的外观,就可以“模板化”'它可以用于未来的调查。