在我的域模型中,我有一个客户聚合根。 我的业务规则是->我不能添加具有相同名字,姓氏和电子邮件地址的新客户。 这种验证检查的最佳位置在哪里?
从我的角度来看,第一完全错误地将这种支票放入我的客户群中。 第二,将这种验证添加到我的CustomerRepository中也感觉很不自然,因为我想在内存集合中对它们进行同样的处理,并且对所有聚合的逻辑基本相同。 第三,我也不会将此检查添加到我的CreateCustomer-Command内,因为那样的话,此重要检查不在我的域模型之内。
所以我看到的最后一个选择是创建一个CustomerService类,并将这种验证放在这里。
您还有其他建议吗?我已经读过许多其他文章,但它们并没有给出明确的答案... 谢谢!
答案 0 :(得分:0)
您所描述的问题的总称是set validation。
如果企业可以在短时间内违反该不变式,那么您将建立一个过程,以监视所有客户集合以查找冲突,并在发现冲突时通知某些补救过程。您可以通过将对先前条目的检查合并到业务逻辑中来减少(但不能消除)冲突的风险;在数据竞争中仍然有可能违反约束。
如果这样做是不可接受的(也许在法律或财务上过于严格),那么事情就会变得更加艰难。
有时可行的一个答案是采用必须唯一的值,并使用这些值为集合生成唯一的标识符。不幸的是,名字,姓氏和电子邮件地址不够稳定,无法很好地采用该方法(如果您的客户更改了他们的电子邮件地址?或法定名称?会发生什么情况?)
当您修改其中一组客户时,这将锁定整个客户组。这可能很简单,例如强制执行任何将要修改客户的流程以获取共享锁,或者通过将所有客户置于单个集合中,或者将约束编程到存储中(请考虑RDBMS中的约束)。 / p>