具有相关对象的验证/业务规则
Validation / Business rules with related objects
假设我有一个具有嵌套属性的 class:root.propA.propB.propC
,其中每个道具由 class 表示:propA
by classA
,propB
classB
,propC
classC
和 root = 聚合。
假设几个对象相互关联:root1 --> (root2, root3)
、root2 --> root4
、root4 --> root1
.
在 DDD 中,“验证逻辑”/“业务规则”应该在每个 class 中。我想在每个 class 中都有完整的上下文来执行规则。例如:propC
由 classC
表示——我想要一个上下文:
root1, root2, root3, root4
(因为它们是相关的):例如,我想确保只有 1 propC
具有特定值
- 我想要
propC
的父级:例如,我想检查父级是否具有特定值(应该可以使用 entity framework 作为导航 属性?)
如何解决?
- 在每个 class 的 CTR 中注入上下文,然后设置相关
root
对象的属性?
- 每个 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 之间的界限由您决定。此限制称为 有界上下文 。
假设我有一个具有嵌套属性的 class:root.propA.propB.propC
,其中每个道具由 class 表示:propA
by classA
,propB
classB
,propC
classC
和 root = 聚合。
假设几个对象相互关联:root1 --> (root2, root3)
、root2 --> root4
、root4 --> root1
.
在 DDD 中,“验证逻辑”/“业务规则”应该在每个 class 中。我想在每个 class 中都有完整的上下文来执行规则。例如:propC
由 classC
表示——我想要一个上下文:
root1, root2, root3, root4
(因为它们是相关的):例如,我想确保只有 1propC
具有特定值- 我想要
propC
的父级:例如,我想检查父级是否具有特定值(应该可以使用 entity framework 作为导航 属性?)
如何解决?
- 在每个 class 的 CTR 中注入上下文,然后设置相关
root
对象的属性? - 每个 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 之间的界限由您决定。此限制称为 有界上下文 。