2017-09-06 41 views
1

假设我们有Foo作为一个AggregateRoot。并且有一些通用的Foo s以及EnhancedFoo s带有许多扩展属性。是否可以在单个聚合根类上公开“操作”以获得通用属性和增强属性,并通过验证检查来引发异常,如果在非增强对象上调用增强动作Foo对象?从技术上讲,在这种情况下,AggregateRoot将为所有支持的Foo类型聚合所有可能的“操作”?AggregateRoots如何聚合不同的对象类型?

显然很大程度上取决于领域结构,但我认为这种假设的情况是相当普遍的。可能是基本的问题,但我只是开始与聚合/根。每一次反馈

更新

比方说,我们有作为AggregateRoot。而且有通用 S以及FlyableFoo S,SwimmableFoo S,等等。所以,总要“知道”所有可能的行为(飞,嘎嘎,游泳),并适当地将其暴露在服务功能。如果有什么被称为某些不被当前对象“支持”的原因,Aggregate可能会抛出一个异常“对不起,企鹅不能飞”。

回答

2

我不认为这是一个好主意。您应该尽量在使用DDD方法的同时保持干净的代码。因此,我建议您在编码聚合时遵守SOLID原则并尝试favor composition over inheritance

另外,在设计Aggregates时,您不应该考虑properties,而应该考虑状态和行为。这在CQRS中更重要,因为您不查询聚集,您没有任何获取(根据DDD,您没有任何setter以及您应该根据无处不在的语言为您的方法命名)。

您可以使用继承,但您必须确保获得(代码重用)比您松动(增加认知努力)更大。我不推荐它。

如果有某些被当前对象“支持”的原因,Aggregate可能会抛出异常“对不起,企鹅不能飞”。

这会破坏Liskov substitution principle

+0

从我的问题不清楚,但我实际上使用组合。反过来说,“属性”我应该说“行为”。我添加了更新到我的问题,请检查。另外,感谢您提及“构成超越继承”图,这非常有帮助! – Tenek

+0

@Tenek看到我更新的答案 –