在DDD中加载域实体的子集合

时间:2014-01-22 21:49:51

标签: architecture entity domain-driven-design ddd-repositories

我有一个聚合体,它由一个名为Master的根实体和一个名为Detail的叶子构成。因此,Master实体具有Detail实体的集合。我没有将Details集合暴露给客户端,因为我不想让客户端直接向其添加Detail项。相反,我在我的主实体上有一个AddDetail方法,它在添加新的Detail项时立即验证域不变量,并允许我们在该位置应用我们的域规则。详细信息作为只读IEnumerable属性公开。 当我想在MasterRepository中加载Details项时,问题出现了。由于没有项目可以添加到Details集合中,我不知道如何加载作为Master实体状态一部分的Details。另一方面,我不认为在加载主实体的状态时使用AddDetail方法是一个好习惯,因为那时规则已经应用,并且在加载实体的状态时验证它们将是冗余重载。 。此外,添加新的详细信息会触发一些我不希望在加载实体时发生的域事件。

2 个答案:

答案 0 :(得分:2)

  

我不认为在加载Master实体的状态时使用AddDetail方法是一个好习惯

你是对的,使用AddDetail方法并不是一个好主意。

  

我不知道如何加载作为Master实体状态一部分的Details。

如何加载Master实体的其他属性?

我提到的很多可用选项回答了另一个问题(How to retrieve Domain Object from Repositories):

  1. ORM可以映射私有字段(例如NHibernate,EntityFramework)。
  2. 反射可用于访问私人字段。
  3. 可以通过用于构造实体的公共构造函数传递集合。我会避免使用公共setter进行收藏。
  4. 第三部分框架有时很有用(例如AutoMapper)
  5. 由于Detail实体的集合只是Master的属性,我会使用一种方法来加载其他属性。

答案 1 :(得分:1)

您没有说明您使用的是哪种语言,但ORM框架通常会通过反射直接访问Master的内部字段。

如果您自己滚动或使用没有反射的语言,您可以添加一个内部实用程序类(例如,在同一个程序包中),该实用程序类具有对字段的包/朋友访问权限,并且可以由存储库用于访问字段直接