Domain driven design 在域之间共享ValueObject是个好主意吗?
假设我们在一个系统中有两个域:Orderdomain和Customerdomain 这两个域都相当复杂和庞大,因此不能将它们合并到一个域中 但他们之间有业务关系。在每个订单上,客户都充当订购者 我脑子里至少有三个解决办法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
您更喜欢哪一个?或者您能想出第四个更好的吗?我将尝试回答您关于价值对象的一般问题,以及您评论中更具体的问题
不,我不会,正如其他人所指出的,客户是在订单领域工作的人应该知道并需要数据的东西。如果您声称“客户”和“订单”代表两个不同的域,那么我假设“客户”域类似于CRM数据?如果您分别对“客户”和“订单”进行建模,则“客户”域不能包含您在“订单”域中所需的数据,例如账单地址。我理解您反对紧耦合和大型对象图,但您可以通过确保在系统中允许多个“客户”实体来处理这一问题;每个“客户”在有界上下文中表示其自己的数据集和行为。例如,您可以在CRM域中有一个客户实体,在“订单”域中有一个客户实体(我猜它实际上是一个订单域,因为“订单”听起来像一个实体,而不是一组封装的业务流程)。在您的CRM域中,客户可能会有诸如电话号码、联系人、邮政地址等内容),在“订单”域中,您的客户肯定会有订单,以及账单地址等内容。因此,总结一下:不要创建一个拥有一切的客户,将其放在自己的域中,并删除与订单的关系,您只是在缩小对象图的大小。我将尝试回答您关于值对象的一般问题,以及您评论中更具体的问题
不,我不会,正如其他人所指出的,客户是在订单领域工作的人应该知道并需要数据的东西。如果您声称“客户”和“订单”代表两个不同的域,那么我假设“客户”域类似于CRM数据?如果您分别对“客户”和“订单”进行建模,则“客户”域不能包含您在“订单”域中所需的数据,例如账单地址。我理解您反对紧耦合和大型对象图,但您可以通过确保在系统中允许多个“客户”实体来处理这一问题;每个“客户”在有界上下文中表示其自己的数据集和行为。例如,您可以在CRM域中有一个客户实体,在“订单”域中有一个客户实体(我猜它实际上是一个订单域,因为“订单”听起来像一个实体,而不是一组封装的业务流程)。在您的CRM域中,客户可能会有诸如电话号码、联系人、邮政地址等内容),在“订单”域中,您的客户肯定会有订单,以及账单地址等内容。因此,总结一下:不要创建一个拥有一切的客户,将其放在自己的域中,并删除与订单的关系,您只是在缩小对象图的大小。看起来就像您所说的域是指实体。问题还不清楚,我认为您将实现细节与概念设计混为一谈。若订单和客户之间存在业务关系,那个么将这种关系建模为一等公民。不,我指的不是实体或集合。我指的是不同的领域。但同样的问题也适用于此,简单的回答是,实体肯定可以共享相同的值对象类型。从我的观点来看,你不能仅仅在一个紧密耦合的领域中为一个大企业建模。仅仅因为实体之间有某种关系,他们就不能是我世界上的一等公民。随着时间的推移,这个领域模型将是一个难以发展的庞然大物。你如何将客户与订单区分开来?一个没有另一个就没有意义。没有客户,订单能否存在?如果不是,那么它们怎么可能不在同一个域中呢?看起来就像你说的域你指的是实体。问题不清楚,,