我有两个聚合根引用另一个聚合根(首先通过第二个聚合根的标识引用第二个)。
来自我的应用层的命令(通过MVC asp.net)现在删除了我的第二个聚合根。
在删除根目录时,是否发送一个域事件,告诉第一个聚合根目录为“NULL”对第二个聚合的引用现在不存在?
JD
答案 0 :(得分:7)
你的方式错了。退出您面临的技术问题。首先,我怀疑在你无处不在的语言中存在“删除”这样的事情。很可能人们会将其称为“存档”,“无序”,“删除”,“缺货”,......某些术语表示特定聚合在其生命周期结束时。当域名专家谈到这些事情时,这应该是您向他们提出以下问题的一个问题:“如果您停止使用产品,那将如何影响该特定产品的促销活动?”。要与问题相关联:促销是包含对产品聚合的引用的聚合。所以它非常成为一个商业问题而不是技术问题。大多数情况下,商业人士已经制定了一个流程来防止此技术问题的发生(例如,您无法停止在促销中使用的产品)。我希望现在很清楚,给你一个通用的答案不是一个选择。
答案 1 :(得分:1)
我认为这个问题实际上并没有被另一个已经在这里呆了一段时间的回复者回答。我也认为来到这里的人应该得到一个答案。我会回答这个问题(见#2),但让我先澄清一些事情。
#1 为什么不删除?
所以,首先,我同意另一个答案,并且会说在领域术语中,通常没有删除这样的事情。我喜欢 this article by Udi Dahan 解释这一点的角度。
我反对删除的解释有点老式,更简单(是的,甚至更简单),希望更容易理解。想象一个没有(或之前)计算机的世界。人们在纸上做一切。想象一下(我知道这可能很尴尬)你正在处理一本书而不是视频。包含与您要删除的视频相同信息的图书。你不能删除这本书,但你可以“烧掉”它或“扔掉”它。它实际上继续生活,但改变了它的存在形式。类似地,您的视频从其当前状态移动到下一个状态,或者它甚至可能会转换并生成下一个状态的对象。无论如何,关键是,您正在更改状态而不是删除它。因此,最好将其建模为状态更改。这就是重点,虽然我知道它可能不清楚。
#2 如何更新其他聚合?
很简单,原始聚合(改变状态的聚合,见上文)调度一个描述它发生了什么的事件。您订阅该事件,事件处理程序会更新其他受影响的聚合。我认为这是您在没有所有“无法删除”对话的情况下寻找的答案。抱歉,我再次添加了那部分,但我想为读者澄清这两点。
扩展这本书的例子:当你把这本书扔掉时,你需要更新书目录(或显示每本书在图书馆中的位置的索引纸),更不用说被扔掉的书了。因此,如果没有计算机,将旧书丢弃的人会告诉负责目录的另一个人从列表中刮掉这本书(读作“当书被丢弃时,目录必须将其从列表中删除”)。这就是该活动的目的,但在数字方面。