域驱动设计:聚合根问题

时间:2010-10-18 09:55:39

标签: design-patterns architecture domain-driven-design

目前我不知道如何识别聚合根。

我有以下课程。

- Garage
- Organisation
- RuleSet
- Rule
- OrganisationRule
- GarageRule

Garage可以包含多个Organisations

RuleSet是引用Rules的实体。

RulesRuleSet直接关联。

然后有OrganisationRulesRuleSetOrganisation相关联。

最后有GarageRulesRuleSetGarage相关联。

规则集及其规则背后的整个概念是,用户可以在规则集级别上为规则集添加规则。然后,这些规则可以被组织级别定义的规则覆盖。同样,可以为车库添加更具体的规则。

所以稍后,客户想要获得车库的规则,它将首先检查与车库直接相关的规则,然后它将检查组织级别的规则,然后检查规则集级别。

我现在的问题是识别聚合根。另外,如果例如RuleSet是所有规则的聚合根,我不知道如何进行高性能查询以获得特定车库的规则(大约有60000个车库)。

所以例如:

public class RuleSet
{
    public ICollection<Rule> MetaRules { get; set; }

    public ICollection<OrganisationRule> OrganisationRules { get; set; }

    public ICollection<GarageRule> GarageRules { get; set; } 
}

或者我应该让每个规则实体都有自己的聚合根?那么我就可以做一些高性能的查询,例如garageRuleRepository.GetRulesByRuleSetAndGarage(RuleSet ruleSet, Garage garage)。否则,我将在我的聚合根目录中找到哪些非常大的集合,我无法正确查询。

1 个答案:

答案 0 :(得分:4)

我已经制定了你的模型,所以我可以更好地理解它 - 希望我做对了。

  

我现在的问题是确定   聚合根

我认为聚合的孩子部分知道他们的父母是谁;并且考虑到(如果我理解正确的话)如果没有父级RuleSet,规则就不能存在,你肯定可以将它们映射回来;所有其他课程也是如此。

  

或者我应该让每个规则实体成为它   拥有聚合根?

不 - 不要将实施挑战与模型混淆。

  

那么我可以做高性能的查询   例如garageRuleRepository.GetRulesByRuleSetAndGarage(RuleSet ruleSet,Garage garage)。

嗯 - 也许吧。如果我们知道规则或RuleSet,我们应该知道它最终属于哪个Garage,所以你不需要传递RuleSet。

  

否则我会最终结束   我的聚合中的大型集合   我无法正确查询的root。

一方面,您可以为Garage加载完整的对象图并将其放在内存中,或者,您只能加载图的一部分并使用基于LazyLoad的实现来获取需要时的信息。

这取决于您的应用程序架构;如果你有内存来存储一个完整的图形并且获取数据是一项昂贵的任务(即 - 你只想尽可能少地做),那么前一种方式可能更好;如果记忆力不足,但获取信息不是负担,也许是后者。

您的模型基于您的原始问题: alt text

我的Suggesed模型:

alt text

  • Garages and Organizations都拥有一个RuleSet,它由任意数量的规则组成;我不认为让车库(等)直接绑定到规则是你实际上意味着/或想要的。
  • 我已经对RuleSet进行了子类型化,因为您可能希望在该级别应用不同的逻辑。