Domain driven design 存储库方法还是聚合根方法?

Domain driven design 存储库方法还是聚合根方法?,domain-driven-design,Domain Driven Design,我有一个名为Person的实体。它表示可以与其他人共享信息的人。我还定义了两个实体电话号码和地址,它们表示一些信息。每个人都可以在数据库中提供他们的电话号码和地址,例如电话号码和地址,并且提供的信息仅属于该人。然后,拥有特定信息电话号码和地址的人可以通过实体关联将这些信息电话号码和地址相互关联,并可以将此关联共享给其他人 我试图遵循领域驱动的设计方法。由于电话号码或地址只属于一个人,因此电话号码和地址的身份是该人身份的本地身份。因此,我认为有一个集合,包括实体个人,电话号码,地址和关联。聚合的根

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

我试图遵循领域驱动的设计方法。由于电话号码或地址只属于一个人,因此
电话号码
地址
的身份是该
身份的本地身份。因此,我认为有一个集合,包括实体
个人
电话号码
地址
关联
。聚合的根将是实体
Person
。因此,显然我需要一个实体
Person
的存储库,因为它是聚合根,我可以使用这个存储库从数据存储中“重新构造”Person元素

现在,某个人想添加电话号码和地址,并想将其关联起来。因此,假设这个人已经存在于数据存储中,我将使用存储库获得有问题的
。然后如何添加信息

我看到两种方法。在
个人
实体中使用
添加电话号码
添加地址
方法,或使用
电话号码
地址
关联
的存储库

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


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

封装电话号码和地址的对象的概念在您的域中似乎很重要,所以你可以有一个像ContactInfo实体(“Association”似乎有点太模糊)的东西,包含一个电话号码和一个地址。电话和地址本身并没有真正的“改变”——而是通讯录信息发生了变化,所以你可以让它们成为有价值的对象


Person将仍然是聚合根,并且是唯一拥有存储库的实体。您只需调用person.AddContactInfo()来添加新的联系人信息,联系人信息将在以后与此人一起保留。

如果您举一个更准确的例子,这将更容易理解。我确信你真实系统中的实体并没有被命名为“X”和“Y”@Marius,一切都结束了。我认为保持通用性会更好,但我认为你是对的,因为解决方案通常取决于域。你要添加的电话和地址是否已经存在于数据存储中的某个位置,还是要创建它们?@ian31在这种情况下,它们不存在,因为此人想要提供信息。所以,我需要使用构造函数或工厂实例化电话或地址,并将其保存在数据存储中。“所属”的定义是什么?你说电话和地址属于一个人,但可能与其他人共享。在法律运作方面,拥有信息的人与通过关联获得信息的人有什么不同?