我有一个名为Person
的实体。它代表可以与其他人共享信息的人。我还定义了两个实体TelephoneNumber
和Address
,它们代表了一些信息。每个人都可以为数据库配置他们的电话号码和地址,作为TelephoneNumber
和Address
的实例,并且所提供的信息仅属于该人。然后,拥有某个信息电话号码和地址的人可以通过实体Association
将这些信息相互关联,并可以将此关联分享给其他人。
我正在尝试遵循域驱动的设计方法。由于电话号码或地址仅属于一个人,因此TelephoneNumber
和Address
的身份属于此Person
身份的本地身份。所以,我认为有一个聚合包含实体Person
,TelephoneNumber
,Address
和Association
。聚合的根将是实体Person
。所以,显然我需要一个实体Person
的存储库,因为它是聚合根,我可以使用这个存储库“重建”数据存储中的person元素。
现在,某个人想要添加电话号码和地址,并想要关联它们。因此,假设此人已存在于数据存储中,我使用存储库获取有问题的Person
。我如何添加信息?
我看到两种方法。使用addTelephoneNumber
实体中的addAddress
和Person
方法,或使用TelephoneNumber
,Address
和Association
的存储库。
假设第一种方法是正确的,那么这些方法必须做什么?这些方法如何将信息添加到数据存储?我确切地说,我已经为Person和TelephoneNumber / Address之间的关联选择了一个遍历方向,从TelephoneNumber / Address到Person。因此,每次检索一个Person时,我都不会检索所有的手机和地址。 在这种情况下,当一个人想要使用addTelephoneNumber方法添加手机时,该方法的作用是什么?新手机放在哪里?
PS :一个人拥有的电话号码和地址不一定是这个人的电话号码和地址,它们只是此人知道并希望与其他人分享的信息。
答案 0 :(得分:2)
封装电话号码和地址的对象的概念在您的域中似乎很重要,因此您可能会有类似于ContactInfo实体(“关联”似乎有点过于模糊)的内容,其中包含PhoneNumber和Address。电话和地址本身并没有真正“改变” - 而是更改的ContactInfo,因此您可以使它们成为价值对象。
Person仍然是聚合根,也是唯一拥有Repository的实体。你只需要调用person.AddContactInfo()来添加新的联系信息,联系人信息将在以后与该人一起保留。