DDD - 唯一约束的验证

时间:2010-04-18 02:03:14

标签: validation domain-driven-design

在DDD中,您绝不应让您的实体进入无效状态。话虽如此,您如何处理唯一约束的验证?

创建实体不是一个真正的问题。但是,假设您有一个必须具有唯一名称的实体,并且该实体类型有一千个实例 - 它们不在内存中但存储在数据库中。现在假设你要重命名一个实例。

你不能只使用一个setter ......对象可能进入无效状态 - 你必须对数据库进行验证。

如何在网络环境中处理这种情况?

2 个答案:

答案 0 :(得分:11)

唯一性约束可以简化为持久性异常,而不是被视为“无效状态”。在持久化对象之前,它不是无效状态。唯一性在持久性的背景下才有意义。实际上,您可以将此类规则放在验证机制中以帮助降低此错误的可能性,但在任何实际的多用户系统中,在成功的工作单元完成持久性操作之前,您无法保证唯一性。

因此,您可能需要在验证机制中使用此功能,但必须在持久层中强制执行此操作。

我通常喜欢DDD作为一种方法论,但我认为“不允许对象进入无效状态”可能需要一些曲折的抽象。在Web应用程序中,拥有单独的“视图模型”是一种可能的解决方案,作为持久性之前的中间层,但我通常不这样做,直到我确信它会比简单的替代方案减少痛苦。

答案 1 :(得分:0)

为了寻找您问题的答案,我发现了这篇文章:https://thinkbeforecoding.com/post/2009/10/28/Uniqueness-validation-in-CQRS-Architecture

实质上:查找唯一性的范围,并在表示该范围的聚合根中存储唯一值的权威列表。

例如,给定用例“在注册新用户时,所请求的登录必须是唯一的”这将是:登录必须在租户(或公司或国家,......)中是唯一的。将有关给定登录的信息存储在代表租户的聚合根目录中的列表中。

通过这种方式,您可以确保租户永远不会进入无效状态。