域聚合根与实体树

时间:2013-06-26 14:22:44

标签: design-patterns tree domain-driven-design entity cqrs

我的聚合根节点的一个属性是类似实体任务的树。像

- Node
    - Name
    - Release
    - User
    - task
       - task
       - task
            - task
       - task

任务的树可能非常大,因此未完全加载到内存中。我可以实现某种类型的对象延迟加载或动态查询。此外,我需要一个简单的方法来添加一个像Task :: addSubtask这样的函数的新任务......但是我的直觉告诉我这些解决方案在很多层面都是错误的。

我正试图从这个问题中学习一些关于DDD的课程。所以我想找到对这些假设的确认。

  1. 任何聚合根应始终完全加载。任何部分加载都需要一个子组件能够执行一个查询(通过一个仓库,存储的查询...),这会产生很多规则:单一责任,对持久性机制的无知......(注意:我没有ORM默认情况下提供延迟加载的图层

  2. 内存中任务的“树形”实际上只对GUI中的Outline视图是必需的。因此,我应该有一个虚拟复合,可以对我的域模型的服务层执行查询。

  3. 由于没有理由在节点的上下文之外有任务,我的节点存储库应该处理任何需要树探索的操作,比如:

    (List *)findChildrenOfTask(Task * aTask)

    (List *)findChildrenOfTask(Task * aTask,String regexInText)

    (void)addChildToTask(Task * aTask)

  4. 这些是我的假设,但我想与有更多DDD经验的人确认一下。 “仅GUI中的树”似乎也激发了一些关于CQRS思想的想法。这个问题是采用CQRS用于DDD的好处的一个例子吗?

1 个答案:

答案 0 :(得分:3)

这个确切的例子实际上是在Vaughn Vernon的书实现领域驱动设计

中解决的。

那说我邀请你思考以下内容:

  • 任务是否需要与Node在事务上保持一致?如果不是它可以是它自己的Aggregate,它大大简化了事情。请记住,您从命令
  • 的角度考虑这一点
  • 如果该树仅用于查询,为什么不让DTO担心而不是破坏您的域模型?

我将完全承认,弗农在解释这一问题方面比我做得更好。