在DDD透视图中Category
,Product
和Property
是实体:它们都对应于具有自己标识的对象。
选项1:您的原始设计
您建立Category
了单个聚合的根。一方面,这是有道理的,因为在修改其对象时,聚合应确保一致性,并且Product
必须具有以下Properties
内容Category
:
但是另一方面,单一聚合意味着其所有对象都与拥有它们的根相关,并且所有外部引用都必须通过该聚合根进行。这意味着:
- 一个具体
Product
属于一个并且只有一个Category
。如果Category
删除,则其也将删除Products
。
- 一个特定的
Property
事物属于一个并且只有一个Category
。否则,如果“电视屏幕”和“计算机监视器”将是两个类别,则“电视屏幕:尺寸”和“计算机监视器:尺寸”将是两个不同的属性。
第二点与您的叙述不符:“ 但是当我只需要添加一个Property
不属于任何类别的新内容时,我该怎么办 ”。尚不清楚是否Properties
可以在不同的地方使用相同的东西Categories
。
选项2:总资产以外的财产
如果a Property
独立于而存在Categories
,则它必须在集合之外。如果您想在Properties
两者之间共享Categories
(对于高度,宽度,大小等有意义),也是如此。看来确实是这样。
结果是在Property
和属于聚合的事物之间的链接上:尽管您可以从聚合的内部导航到Property
,但不再允许您直接从a Property
转到对应的值。此可导航性限制可以在UML图中显示:
请注意,这种设计不会阻止你有一个List<Property>
中Category
,语义上(如JAVA):列表中的每个基准是指可共享的Property
存储库中的对象。
这种设计的唯一问题是您可以更改a Property
或将其删除:由于它不在聚合中,因此聚合无法照顾其不变式的一致性。但这不是问题。这是DDD原则和现实世界的复杂性的结果。以下是Eric Evans在他的开创性著作《域驱动设计:解决软件核心中的复杂性》中的一句话:
跨越AGGREGATES的任何规则都不应始终保持最新。通过事件处理,批处理或其他更新机制,可以在指定的时间内解决其他依赖性。但是,在每次交易完成后,将强制在AGGREGATE中应用不变式。
因此,是的,如果您更改,则Property
必须确保服务会检查引用它的类别是否已根据需要进行更新。
选项3:不同汇总中的类别,属性和产品
我只是想知道是否建立了a Product
属于一个单一的假设Category
:
- 我经常看到网上商店提出
Product
以下建议Categories
。例如,您会在“笔记本电脑”类别和“计算机”类别下找到“笔记本电脑X型Y笔记本电脑”,在“打印机”,“扫描仪”和“传真”类别下找到“多功能打印机Z”。
- 有人创建
Product
第一个,然后稍后才将其分配给Category并填充值,这是不可能吗?
- 如果要拆分类别,是否真的要删除其产品,然后在新类别下重新创建它们?
它不会简化聚合,您将拥有更多跨聚合的规则。但是您的系统将提供更多的未来证明。