我应该在哪里检查ddd体系结构中的唯一性



在我的域模型中,我有一个客户聚合根。我的业务规则是->我不能添加具有相同名字、姓氏和电子邮件地址的新客户。这种验证检查的最佳地点在哪里?

首先从我的角度来看,将这种检查放在我的客户汇总中是完全错误的。其次在我的CustomerRepository中添加此验证也感觉不自然,因为我希望将它们视为简单的内存集合,对我的所有聚合使用基本相同的逻辑。第三次我也不会在CreateCustomer命令中添加此检查,因为此重要检查不在我的域模型中。

因此,我看到的最后一个选项是创建一个CustomerService类,并将这种验证放在这里。

你还有其他建议吗?我已经阅读了许多其他帖子,但它们并没有给出明确的答案。。。谢谢

您描述的问题的通用术语是设置验证。

如果业务部门可以接受在短时间内违反不变量,那么您可以建立一个流程来监控所有客户聚合,寻找冲突,并在发现冲突时通知一些补救流程。您可以通过在业务逻辑中加入对先前条目的检查来降低(但不能消除)冲突的风险;在数据竞赛中仍然存在违反约束的可能性。

如果这样做是不可接受的(也许法律或财务影响太严重),那么事情就会变得更加困难。

有时会起作用的一个答案是获取必须唯一的值,并使用这些值为聚合生成唯一标识符。不幸的是,名字、姓氏和电子邮件地址不够稳定,不适合采用这种方法(如果您的客户更改了他们的电子邮件地址或法定名称,会发生什么?)

这样,当你对其中一个客户进行修改时,就可以锁定整个客户群。这可能很简单,比如强制任何要修改客户的流程获取共享锁,或者将所有客户放在一个聚合中,或者将约束编程到您的存储中(想想RDBMS中的约束)。

最新更新