DDD 聚合验证

DDD Aggregates Validation

我正在构建一个将通过 RESTful 服务公开其部分功能的应用程序,我的应用程序包组织如下

  1. 应用程序 --> 此包包含 RESTfull 服务
  2. 模型 --> 包含聚合、值对象等领域模型...
  3. 基础结构 --> 包含访问数据库
  4. 所需的 类 组
  5. Mongo 数据库 --> 我的数据库

应用程序包公开端点

CastReview(UUID reviewedEntityId, string review)

从请求正文中检索到的审核是强制性的。

现在我的问题是应该在哪里进行验证

  1. 我是否应该将验证逻辑保留在聚合内部和应用程序内部?我只是构建聚合实例并检查聚合是否有效

  2. 或者我是否应该在应用程序包内以及聚合内进行验证

对于聚合,我不会将其称为验证,而是不变的执行,因为它们应该是 always valid。您不只是修改聚合然后让外部验证器检查它,聚合会强制执行它们自己的不变量。

有些规则显然是域不变量,因为您必须对聚合数据有深入的了解才能执行它们,而有些规则绝对是适用规则(例如电子邮件确认 == 电子邮件)。但有时界限是模糊的。我肯定会在客户端和应用级别检查评论是否为 null 或空,同时我不会考虑 Review Aggregate OK 如果它有一个 null 评论,所以我会做两个都。但这可能取决于域和 YMMV。

完整性约束(或 "invariants",如果您更喜欢该术语)应在 (domain/design/data) 模型中定义。然后他们应该多次检查:

  1. 在前端用户界面中(输入/更改和提交)以获得响应式验证。
  2. 在后端应用程序或基础设施保存之前
  3. 并且在 DBMS 中(提交前),如果您的数据库与其他应用程序共享。

另请参阅我的文章 Integrity Constraints and Data Validation