我与合作伙伴讨论过这个场景:
**Publishers root entity
Advertiser root entity**
每个实体都有共同的信息: 电子邮件,BillingAddress,NormalAddress,性别,SSN等
我决定: 具有Value对象的Person实体地址和其余属性。这样,如果我想访问有关Person(电子邮件,性别,dateofbird)的特定信息,我不必通过发布者或广告客户根实体来获取它(将Person视为聚合根)。
Sample: **Person.BillingAddress.Address1 :
Person.BillingAddress.Address2 :
Person.BillingAddress.POBOX :
Person.Email :
Person.Sex**
我的队友建议使用抽象类,广告客户和发布者继承自Person抽象类,以便拥有所有常见属性。
最好的方法是什么?如果您有,请指导我们。
谢谢, 佩德罗·德拉克鲁兹
答案 0 :(得分:2)
我认为你是对的。当行为很常见时(某些东西是一种其他的东西),继承才有意义,那么人不仅仅是因为属性类似于其他东西。它不是代码重用。
答案 1 :(得分:1)
你应该favour composition over inheritance。
您的设计更好,否则如果在某些时候您需要在此层次结构中引入其他内容(例如,使您的根实体AuditableEntity),您将无法这样做(除非您的语言支持多重继承 - 这是不好的)。
答案 2 :(得分:1)
在这种情况下我不关心继承 - 我认为它很脆弱。
我更喜欢基于构图和角色的方法。管理员角色可以包装Person对象,并具有与角色关联的所有特殊属性和行为。
答案 3 :(得分:1)
我认为广告客户和发布商应该继承公司,而公司应该有一系列联系人(或您的案例中的人员)。
从技术上讲,公司可以拥有一系列分支机构。
然后每个分支都有一个地址,每个联系人(人)都可以有一个地址。
答案 4 :(得分:1)
@ Scott继承人的问题是什么?
@Tim如何继承失败?
将Person作为抽象类,将Advertiser和Publisher作为具体类。通过这种方式,广告商将拥有共同的属性,对于发布者而言,现在我们可以传递人。
广告商是人。 出版商是人。我更喜欢继承
答案 5 :(得分:1)
我的2美分......
当我正在阅读你的问题时,看来自然人并不是你模特的一部分。您的模型涉及发布商和广告商。
首先。我认为自然人(或公司)必须生活在一个独立的“层级参考”中。域,可以转换为"层或合作伙伴存储库"。
第二。由于您的模型需要发布商和广告商,我认为应该由DAL(以及存储库,但以较小的方式)负责定义和创建这些实体。 DAL是你应该拥有物理人物项目的唯一地方(因为它不是模型中的实体,我称之为#34;项目"),你应该注意将它与模型隔离开来。自然人必须留在数据方面,因为它在出版商和合作伙伴实体的构建计划中有所暗示。对这些实体进行精炼和保湿应该在存储库中。
我认为你不应该有一个" Person"在你的模特中,我认为你应该拥有它" under"存储库,从模型中看不到。
答案 6 :(得分:0)
(警告 - 过于简单化)
在这种情况下的继承失败了“是一个”测试..
通常你会问“是”我的班级“a”<whatever>
还是“有”<whatever>
答案 7 :(得分:0)
我知道已经有很多年了,在这里回答我为时已晚。
几年前,DDD一词几乎没有什么用,但在微服务时代,DDD的重要性突然上升。因此,对于所有微服务爱好者来说,这个问题会引起很多混乱。
DDD域模型一定不能与OO域模型混淆