多个实体共享的DDD值对象



我一直在研究DDD,并且在价值对象方面有一些问题。我为电子邮件,电话和地址创建了值对象,然后使用其构造函数添加了验证。到目前为止,一切都很好。事实是,我需要相同的值对象,以实现不同的聚合根。假设我有3个汇总根,它们需要相同的值对象(客户,医生,接待员(

我已经看到了一个为每个聚合根创建一个地址的示例,但是我不想重复代码,因为这些值对象还包含验证。我可以在总体根基中分享它们吗?如果是这样,您如何构建它?

电子邮件,电话和地址是不属于您的领域的概念,我想这与医院或类似。

它们将属于我们可以称为"人"之类的另一个领域,您可以在其中定义联系信息概念(电子邮件,电话,电话,地址(。

如何与该域集成?好吧,由于它们是在许多情况下经常使用的概念,因此您可以将它们放入共享内核中。

因此,关于结构的问题,我想您指的是文件夹,将它们放在"医院"有限上下文的结构之外。

使用一个名为Person/Contact的文件夹创建共享内核(由多个域共享(,然后将您的电子邮件,电话和地址值对象放在那里。共享内核就像您使用的库。

希望它有帮助。

通常,在多种类型的实体或聚集根下重用值对象类型没有错。您只需避免复制代码。

对于实例而言,情况并非如此。两个实体(相同或不同类型(永远不应共享值对象的相同实例。对于内存对象和持久数据都是如此。

如果您有多个有限的上下文,则值的对象(例如电子邮件/电话/地址(是共享内核的良好候选人。它们很小且独立,很少成为"上帝对象",他们知道/做得太多。

在代码中,您可以将值对象表示为不变的struct。这将加强ddd中值对象的特征。

在关系数据库中,地址表可以用唯一的密钥列表示像地址之类的对象。代表实体的表可以包含地址表的外国钥匙(一对一关系(。在一对一的关系中,当实体有地址集合时,可以介绍多对多的关系表,每个包含实体的一个关系表。

在文档数据库中,价值对象通常可以嵌入包含实体的文档中。

当然,这些只是一般考虑,这些决定取决于您的特定案例。

最新更新