Domain driven design 在域之间共享ValueObject是个好主意吗?

Domain driven design 在域之间共享ValueObject是个好主意吗?,domain-driven-design,value-objects,Domain Driven Design,Value Objects,假设我们在一个系统中有两个域:Orderdomain和Customerdomain 这两个域都相当复杂和庞大,因此不能将它们合并到一个域中 但他们之间有业务关系。在每个订单上,客户都充当订购者 我脑子里至少有三个解决办法 将customerId作为基本类型存储在Order和Customer上 创建两个ValueObject OrderDomain.CustomerId和CustomerDomain.CustomerId。确保可以比较这些类型是否相等 使用valeobject CustomerId

假设我们在一个系统中有两个域:Orderdomain和Customerdomain

这两个域都相当复杂和庞大,因此不能将它们合并到一个域中

但他们之间有业务关系。在每个订单上,客户都充当订购者

我脑子里至少有三个解决办法

  • 将customerId作为基本类型存储在Order和Customer上

  • 创建两个ValueObject OrderDomain.CustomerId和CustomerDomain.CustomerId。确保可以比较这些类型是否相等

  • 使用valeobject CustomerId创建第三个组件“SharedValueObjects”,并在两个域中使用该类型


  • 您更喜欢哪一个?或者您能想出第四个更好的吗?

    我将尝试回答您关于价值对象的一般问题,以及您评论中更具体的问题

  • 域可以共享价值对象吗
  • 视情况而定。在我目前工作的系统中,我们有15个左右的大型服务,我们共享价值类型,如“EMailAddress”、“PhoneNumber”、“Money”等。这些类型定义明确,我们没有共享问题,但我不会仅仅因为它们可能会在其他地方使用而共享,请向实际使用的人分享您的共享价值类型。共享时,您需要支付系统范围耦合的费用

  • 我是否会将客户与订单之间的关系公开为包装键的值对象

  • 不,我不会,正如其他人所指出的,客户是在订单领域工作的人应该知道并需要数据的东西。如果您声称“客户”和“订单”代表两个不同的域,那么我假设“客户”域类似于CRM数据?如果您分别对“客户”和“订单”进行建模,则“客户”域不能包含您在“订单”域中所需的数据,例如账单地址。我理解您反对紧耦合和大型对象图,但您可以通过确保在系统中允许多个“客户”实体来处理这一问题;每个“客户”在有界上下文中表示其自己的数据集和行为。例如,您可以在CRM域中有一个客户实体,在“订单”域中有一个客户实体(我猜它实际上是一个订单域,因为“订单”听起来像一个实体,而不是一组封装的业务流程)。在您的CRM域中,客户可能会有诸如电话号码、联系人、邮政地址等内容),在“订单”域中,您的客户肯定会有订单,以及账单地址等内容。因此,总结一下:不要创建一个拥有一切的客户,将其放在自己的域中,并删除与订单的关系,您只是在缩小对象图的大小。

    我将尝试回答您关于值对象的一般问题,以及您评论中更具体的问题

  • 域可以共享价值对象吗
  • 视情况而定。在我目前工作的系统中,我们有15个左右的大型服务,我们共享价值类型,如“EMailAddress”、“PhoneNumber”、“Money”等。这些类型定义明确,我们没有共享问题,但我不会仅仅因为它们可能会在其他地方使用而共享,请向实际使用的人分享您的共享价值类型。共享时,您需要支付系统范围耦合的费用

  • 我是否会将客户与订单之间的关系公开为包装键的值对象

  • 不,我不会,正如其他人所指出的,客户是在订单领域工作的人应该知道并需要数据的东西。如果您声称“客户”和“订单”代表两个不同的域,那么我假设“客户”域类似于CRM数据?如果您分别对“客户”和“订单”进行建模,则“客户”域不能包含您在“订单”域中所需的数据,例如账单地址。我理解您反对紧耦合和大型对象图,但您可以通过确保在系统中允许多个“客户”实体来处理这一问题;每个“客户”在有界上下文中表示其自己的数据集和行为。例如,您可以在CRM域中有一个客户实体,在“订单”域中有一个客户实体(我猜它实际上是一个订单域,因为“订单”听起来像一个实体,而不是一组封装的业务流程)。在您的CRM域中,客户可能会有诸如电话号码、联系人、邮政地址等内容),在“订单”域中,您的客户肯定会有订单,以及账单地址等内容。因此,总结一下:不要创建一个拥有一切的客户,将其放在自己的域中,并删除与订单的关系,您只是在缩小对象图的大小。

    看起来就像您所说的域是指实体。问题还不清楚,我认为您将实现细节与概念设计混为一谈。若订单和客户之间存在业务关系,那个么将这种关系建模为一等公民。不,我指的不是实体或集合。我指的是不同的领域。但同样的问题也适用于此,简单的回答是,实体肯定可以共享相同的值对象类型。从我的观点来看,你不能仅仅在一个紧密耦合的领域中为一个大企业建模。仅仅因为实体之间有某种关系,他们就不能是我世界上的一等公民。随着时间的推移,这个领域模型将是一个难以发展的庞然大物。你如何将客户与订单区分开来?一个没有另一个就没有意义。没有客户,订单能否存在?如果不是,那么它们怎么可能不在同一个域中呢?看起来就像你说的域你指的是实体。问题不清楚,,