【发布时间】:2017-07-27 22:47:47
【问题描述】:
我们通常如何处理聚合根的版本控制?
我是这么想的(我在调查设计领域)。
进行版本控制的一种方法是使用一种显式方法来创建基于现有版本的新版本。例如,研究(聚合根)。
所以最初我们有一个聚合根,其根实体是 Study,(业务)键为“ABC”,版本为“1”。
通过在 Study 上调用方法“newVersion()”,将创建该 Study 和属于同一聚合根的所有其他实体的副本。
所以基本上,版本控制是通过创建一个单独的实例(聚合根)来完成的。 ID 是复合的(业务密钥 + 版本)。
我们如何知道它是否是一个分支?还是只是一个版本? (1.1?或 2)。我想,这个简单的规则会起作用:如果没有关联的其他版本,那么它就是“升级一个版本”(2);如果已经有另一个版本,那么它就是一个分支(1.1)。
另一个问题:噪音。
但这意味着,我们无法处理/修改现有版本。每次我们想对我们的对象进行修改时,我们都必须创建一个 newVersion。每次???嗯....听起来不对。
或者...我们可以根据标志(活动/非活动,或已发布/未发布)制定这样的规则。如果标志为“未激活”,我们可以直接修改 AR,无需创建新版本。如果标志处于活动状态,我们必须:(a)首先将其设置为“非活动”,然后修改....或(b)创建一个新版本并处理该版本(最初设置为“非活动” )。
您想就此事分享任何想法/经验吗?
【问题讨论】:
-
或者我们可以简单地放弃数字版本,让用户决定版本的名称。反正变化率不高,所以我们可以默认为datestring,YYYYMMDD。唯一性检查可以通过遍历(从当前AR到上一个版本和下一个版本来回遍历)来完成,看看版本名称是否被使用过。它更像是一个标记而不是版本控制。
-
如果您考虑事件溯源,您将记录所有更改,并且可能不会有明确的版本控制。
-
@cokordaraka 您能否详细说明版本控制概念?您是在建模领域,还是想在战术 ddd 块的概念中添加一些东西,即聚合。不清楚 。版本控制是为了什么?
标签: domain-driven-design versioning aggregateroot