具有相关对象的验证/业务规则

Validation / Business rules with related objects

假设我有一个具有嵌套属性的 class:root.propA.propB.propC,其中每个道具由 class 表示:propA by classApropB classBpropC classC 和 root = 聚合。

假设几个对象相互关联:root1 --> (root2, root3)root2 --> root4root4 --> root1.

在 DDD 中,“验证逻辑”/“业务规则”应该在每个 class 中。我想在每个 class 中都有完整的上下文来执行规则。例如:propCclassC 表示——我想要一个上下文:

如何解决?

  1. 在每个 class 的 CTR 中注入上下文,然后设置相关 root 对象的属性?
  2. 每个 class 都有一个相关 root 对象的列表?

我找不到 DDD 和相关对象的示例

root1, root2, root3, root4 (since they are related): For example, I want to ensure, that only 1 propC has a certain value

在 DDD 中,聚合是由业务层原子验证的相关对象的集合。验证逻辑代码被拆分到所有 类(根、A 类、B 类、C 类)以便于实施,但命令最终会更新聚合的状态,然后验证此目标状态不违反任何业务规则。一旦通过验证,它将状态持久性委托给基础设施层,这将更新事务中的存储。

根聚合实例是在事务内部或业务规则验证中不能跨越的边界。如果您需要在多个聚合实例中执行任何业务规则,那么您可以:

  • 创建一个包含所有相关根对象的更广泛的聚合
  • 使用 two-phase 提交分布式事务
  • 使用 saga 模式

I want the parent of propC: For example, I want to check that the parent has a certain value (should be possible with entity framework as navigation property?)

聚合是原子的,因此您始终可以操作根对象和所有相关属性。 root.propA.propB.propC 的父级是 root.propA.propB,因此您可以访问它。您可以向 ClassC 添加导航 属性,以便您可以根据需要从 propC 访问 propB。

警告:Entity Framework 是一个 ORM,它用于基础设施层的持久化,是一个工作单元模式实现。它不适用于域建模,因为使用 EF 将域状态持久保存到 RDBMS 而不是将状态存储在事件源存储库、通过 FTPS 访问的 xml 文件或 nosql 文档数据库中,是一种基础设施实现细节。

匹配域模型和持久性模型仅适用于非常简单的应用程序。您将很快需要将业务模型的复杂性限制为更小的多义设计,而不是读取整个持久性存储。

将重叠聚合数据合并到共享存储和将它们拆分到不同 database-per-service 之间的界限由您决定。此限制称为 有界上下文