Domain driven design 解决困境
我有个人聚合,其中地址是部分和vo,但现在我有另一个聚合付款,其中有另一个vo PaymentInfo,其中包含诸如Creditacard号码和其他详细信息的详细信息,但现在我需要PaymentInfo vo中的账单地址和发货地址。既然地址是人的组成部分,我就不能用它了 所以我所做的Domain driven design 解决困境,domain-driven-design,dns,Domain Driven Design,Dns,我有个人聚合,其中地址是部分和vo,但现在我有另一个聚合付款,其中有另一个vo PaymentInfo,其中包含诸如Creditacard号码和其他详细信息的详细信息,但现在我需要PaymentInfo vo中的账单地址和发货地址。既然地址是人的组成部分,我就不能用它了 所以我所做的 在付款聚合中创建单独的地址Vo,并将其用作帐单地址和发货地址 将地址移入以分离聚合并在PaymentInfo和Person中引用它 亲自创建两个地址,并在PaymentInfo Vo中引用 请帮帮我?这里最重要的是
这意味着,它们可以很容易地在实体之间共享 我的意思是-不应该共享特定的实例,而是应该共享它们的类,键入
Address
,而不是“UK,London street”或“16”。值对象实例应该永远不被共享(同样-因为它们没有标识,它们的状态是定义它们的因素)
因此,在您的位置上-我会确保
地址
作为一个概念,对于个人和支付信息来说都是普遍存在的(它们必须具有相同的结构),将其移动到正确的文件夹/命名空间中,这样我就可以看到它是共享的,并将其用于两个实体
如果它们不是普遍存在的,我会将地址
重命名为个人地址
,并创建第二个-支付地址
(名称可能因您正在建模的业务而异)
从提供的链接中引用Jeff的话:
两个聚合根引用同一实体没有问题-它们只是不能引用另一个聚合的内部。对于更简单的值对象则不同。考虑你可以如何引用日期,比如“2010年8月20日”,在你的类中的任何次数。
我会赞同它无处不在的本质。不要将Person address类引用到帐单地址和发货地址
有两件事是很容易做到的。一是您可以从业务分析师那里获得的沟通优势,二是编码将是明确的和可理解的。将其移动到正确的文件夹/名称空间中,这样我就可以看到它是共享的,并将其用于两个实体。“和”2个聚合根引用同一个实体”没有问题。你是说在共享文件夹中,但address也需要其他类,如country和city?在DDD术语中,这将被称为a。一组核心(通常是值)对象,在有界上下文之间没有差异。