我有一个City
聚合,有一个PointOfInterest
个实体列表。后一个实体在逻辑上位于城市聚合体内,原因不在此解释。除了聚合根City之外,没有实体拥有指向PointOfInterest的链接。
但是,我们有一个可以从City页面浏览的PointOfInterest网页(主要是出于搜索引擎优化的原因),其网址中只有PointOfInterest id
。
因此,从控制器中,直接向CityRepository查询PointOfInterest是很方便的,例如CityRepository.findPointOfInterestById()
。
另一种选择是查询CityRepository.findCityByPointOfInterestId()
,然后查询City.findPointOfInterestById()
,在这种情况下看起来有点麻烦。
第一种方法有什么问题吗?
答案 0 :(得分:4)
由于PointOfInterest是City聚合的一部分,因此您必须接受必须通过遍历City获取对PointOfInterests的所有引用。 CityRepository公开GetPoI()方法似乎不合适,因为它允许外部对象直接引用PoI,从而破坏了聚合的整个目的。此外,对于处理PoI而言,CityRepository似乎并不是一个自然的责任。
正如Wouter指出的那样,你觉得需要做这样令人费解的事情可能表明目前的设计并不合适。如果PointOfInterest成为您应用程序中的主要实体之一,并且如果用户可以从导航开始直接访问它而不必首先通过城市,为什么不考虑给PoI自己的聚合?至于PoI / PoIType关系,PoI的PoIType似乎比其他方式更合乎逻辑。