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

Domain driven design 我应该在哪里检查ddd体系结构中的唯一性,domain-driven-design,ddd-repositories,ddd-service,Domain Driven Design,Ddd Repositories,Ddd Service,在我的域模型中,我有一个客户聚合根。 我的业务规则是->我不能添加具有相同名字、姓氏和电子邮件地址的新客户。 这种验证检查的最佳地点在哪里 首先在我看来,将此类支票放在我的客户总数中是完全错误的。 其次在我的CustomerRepository中添加此验证也让人感觉不自然,因为我想将它们视为简单的内存集合,所有聚合的逻辑基本相同。 第三个我也不打算在CreateCustomer命令中添加此检查,因为此重要检查不在我的域模型中 所以我看到的最后一个选项是创建CustomerService类,并将这

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

首先在我看来,将此类支票放在我的客户总数中是完全错误的。 其次在我的CustomerRepository中添加此验证也让人感觉不自然,因为我想将它们视为简单的内存集合,所有聚合的逻辑基本相同。 第三个我也不打算在CreateCustomer命令中添加此检查,因为此重要检查不在我的域模型中

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

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

您所描述的问题的通用术语是

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

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

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


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

我投票结束这个问题,因为这是一个属于softwareengineering.stackexchange.com的概念性问题。