【问题标题】:Domain Aggregate Root with tree of Entities具有实体树的域聚合根
【发布时间】:2013-06-26 14:22:44
【问题描述】:

我的聚合根 Node 的一个属性是树状的实体组Task。喜欢

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

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

我试图从这个问题中吸取一些关于 DDD 的教训。所以我想找到对这些假设的确认。

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

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

  3. 由于没有理由在 Node 的上下文之外有一个 Task,我的节点存储库应该处理任何需要树探索的操作,例如: p>

    (List*) findChildrenOfTask(Task* aTask)

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

    (void) addChildToTask(Task* aTask)

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

【问题讨论】:

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


【解决方案1】:

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

中得到了解决

也就是说,我邀请您思考以下问题:

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

我完全承认弗农在解释这一点方面做得比我好得多。

【讨论】:

  • 您能说说弗农在哪一章提到的吗?看来我浏览得太快了!在第二次阅读之前,我正在等待成熟一点。但是现在我开始掌握 CQRS 的好处之一
  • 第 10 章,部分:规则:设计小型聚合
  • 哦!我不需要与 Node 的事务一致性……在没有提供延迟加载的框架的情况下,面对深度递归数据库加载,这真是太可怕了。
  • 他在本书的后面部分介绍了这一点,你不能让你的 ORM 支配业务逻辑。我意识到这本书非常密集,我强烈建议您仔细阅读。
  • 感谢您提及!我感觉“太笨拙”了,不想依赖 ORM 并通过尝试实现延迟加载来吓唬自己。我会看看这本书是否回答了我的观点,我记得 Vernon 很好地解释了概念和一些实现细节,但缺乏我想要的细节,比如我提到的三点。我想我会试着看看我的 GUI 的智能树节点会发生什么,它可以进行查询。
猜你喜欢
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多