我在设计聚合根时遇到一些问题。这就是我的想法:)
Store (the aggregate root)
-> Sales - A store create a sale every day
-> Zones - A store is divided into zones
-> Styles - A zone has x number of styles
--> Colors - A style has x number of colors
etc..
现在,基于此,我的聚合根将是商店。但是,如果现在我要围绕它创建一个存储库,它会看起来像这样吗?
public class StoreRepository()
{
Store GetById() {...}
StoreZone GetZone() {...}
List<StoreZoneStyle> GetStylesByZone() {...}
List<Color> GetColorsByStyle() {...}
}
这是继续的好方法吗?
不用说我是DDD的新手。
最佳答案
我认为您需要将聚合边界和实体视为不仅仅是层次结构。很有可能,您将拥有比这更丰富的模型。
判断聚合是否正确的第一种方法是,您可以查看聚合中的每个实体,然后询问“是否需要直接访问此对象?”如果回答"is",则该实体可能不属于集合。
在不了解您的域的情况下,我可能会认为Store确实是一个集合。另一方面,销售更为复杂。是的,销售发生在商店中,但是您是否需要独立使用销售?如果您在仅与商店合作的范围之外需要它们,则Sales可能不在该汇总范围之内。
我在想象样式和颜色都是不可变且可重复的,因此在这种情况下它们很可能是值对象。区域是商店唯一的,还是变化?
就个人而言,我发现在纸上(或白板)领域中确定所有项目的值(value)。我将与利益相关者一起进行发现阶段,然后将他们带到那里。然后,将这些单词用作对话中的领导者,以试图理解它们之间的关系。如果您对利益相关者的采访足够好,那么他/她提供的描述实际上将定义您要寻找的大部分内容。
不要打败一匹老马,但是埃文斯的书绝对值得一读。有点干,但是很有见地。为了快速起步,您可以在InfoQ上阅读free book,它基本上是Evans书的摘要。
关于domain-driven-design - 正确设计汇总根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639773/