存储库方法或聚合根方法?

时间:2012-03-26 08:58:45

标签: domain-driven-design

我有一个名为Person的实体。它代表可以与其他人共享信息的人。我还定义了两个实体TelephoneNumberAddress,它们代表了一些信息。每个人都可以为数据库配置他们的电话号码和地址,作为TelephoneNumberAddress的实例,并且所提供的信息仅属于该人。然后,拥有某个信息电话号码和地址的人可以通过实体Association将这些信息相互关联,并可以将此关联分享给其他人。

我正在尝试遵循域驱动的设计方法。由于电话号码或地址仅属于一个人,因此TelephoneNumberAddress的身份属于此Person身份的本地身份。所以,我认为有一个聚合包含实体PersonTelephoneNumberAddressAssociation。聚合的根将是实体Person。所以,显然我需要一个实体Person的存储库,因为它是聚合根,我可以使用这个存储库“重建”数据存储中的person元素。

现在,某个人想要添加电话号码和地址,并想要关联它们。因此,假设此人已存在于数据存储中,我使用存储库获取有问题的Person。我如何添加信息?

我看到两种方法。使用addTelephoneNumber实体中的addAddressPerson方法,或使用TelephoneNumberAddressAssociation的存储库。

假设第一种方法是正确的,那么这些方法必须做什么?这些方法如何将信息添加到数据存储?我确切地说,我已经为Person和TelephoneNumber / Address之间的关联选择了一个遍历方向,从TelephoneNumber / Address到Person。因此,每次检索一个Person时,我都不会检索所有的手机和地址。 在这种情况下,当一个人想要使用addTelephoneNumber方法添加手机时,该方法的作用是什么?新手机放在哪里?

PS :一个人拥有的电话号码和地址不一定是这个人的电话号码和地址,它们只是此人知道并希望与其他人分享的信息。

1 个答案:

答案 0 :(得分:2)

封装电话号码和地址的对象的概念在您的域中似乎很重要,因此您可能会有类似于ContactInfo实体(“关联”似乎有点过于模糊)的内容,其中包含PhoneNumber和Address。电话和地址本身并没有真正“改变” - 而是更改的ContactInfo,因此您可以使它们成为价值对象。

Person仍然是聚合根,也是唯一拥有Repository的实体。你只需要调用person.AddContactInfo()来添加新的联系信息,联系人信息将在以后与该人一起保留。