Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design DDD:存储库能否返回聚合中的实体?_Domain Driven Design_Entity_Ddd Repositories_Aggregateroot - Fatal编程技术网

Domain driven design DDD:存储库能否返回聚合中的实体?

Domain driven design DDD:存储库能否返回聚合中的实体?,domain-driven-design,entity,ddd-repositories,aggregateroot,Domain Driven Design,Entity,Ddd Repositories,Aggregateroot,我有一个城市集合,有一个兴趣点实体列表。后一个实体在逻辑上位于城市集合中,其原因在此将不作解释。除了聚合根City之外,没有实体拥有指向兴趣点的链接 然而,我们有一个用于PointOfInterest的网页,可以从City页面浏览,该网页(主要是出于SEO原因)的URL中只有PointOfInterestid 因此,从控制器可以方便地直接查询CityRepository中的兴趣点,例如CityRepository.findPointOfInterestById() 另一个选项是查询CityRep

我有一个
城市
集合,有一个
兴趣点
实体列表。后一个实体在逻辑上位于城市集合中,其原因在此将不作解释。除了聚合根City之外,没有实体拥有指向兴趣点的链接

然而,我们有一个用于PointOfInterest的网页,可以从City页面浏览,该网页(主要是出于SEO原因)的URL中只有PointOfInterest
id

因此,从控制器可以方便地直接查询CityRepository中的兴趣点,例如
CityRepository.findPointOfInterestById()

另一个选项是查询
CityRepository.findCityByPointOfInterestId()
,然后查询
City.findPointOfInterestById()
,在这种情况下看起来有点麻烦


第一种方法有什么问题吗?

因为兴趣点是城市聚合的一部分,所以您必须接受所有对兴趣点的引用都必须通过遍历城市来获得。CityRepository公开GetPoI()方法似乎不太合适,因为它会允许外部对象直接引用PoI,从而破坏聚合的整体用途。此外,处理POI似乎并不是一个城市记者的自然责任


正如Wouter所指出的,你觉得需要做这样复杂的事情可能是当前设计不太合适的信号。如果兴趣点是你的应用程序中的一个主要实体,如果用户可以在导航开始时正确访问它,而不必先通过城市,那么为什么不考虑给PoI自己的集合呢?至于PoI/PoIType关系,PoI拥有PoIType似乎比拥有PoIType更符合逻辑。

“由于此处无法解释的原因”,也许这就是重点。若您的兴趣点真的在您的城市聚合中,那个么单独查询它将不是一个好的设计。如果您真的需要在没有city的情况下获取它,它可能不是city聚合的一部分。我希望看到这个注释TBH,但实际上city有一个PointOfInterestType集合,而PointOfInterestType集合又有一个PointOfInterest集合。因此,这将迫使我创建一个PointOfInterestRespository和一个PointOfInterestTypeRepository,这在我看来更难闻,因为这个简单的要求(不要忘记我也可以在URL中包含城市id,但为了干净的URL目的,只需省略这些冗余信息)。但是,如上所述,首先导航到城市,然后导航到Poi。为了保持简单,URL中没有包含城市id,但很可能是其他的,允许从城市进行遍历而没有任何问题。这就是为什么我相信Poi在城市总体上是正确的。我并不完全反对它拥有自己的存储库(以前就是这样!),但这也迫使我拥有一个PoiTypeRepository,这在IMHO中变得相当混乱。如果你有任何想法来避免PoiTypeRepository,我可能会重新考虑我的选择!PoiType可以是值对象吗?如果可以,那么PoI和City都可以毫无问题地引用它,特别是如果它是不可变的。相反,如果PoiType有自己的标识,并且您必须跟踪对PoiType的更改,那么PoiTypeRepository可能是一种方法。您可能会对Vaughn Vernon()的这一系列文章感兴趣,他主张在某些情况下使用小聚合。除了这两种方法和City.findPointOfInterestById()解决方案之外,恐怕没有简单的方法来解决您的问题……我会看看,谢谢。但我不确定我对DDD的理解:当你说“它将允许外部对象直接引用PoI”时,如果我记得很清楚的话,Fowler说,虽然对象不能在聚合中保持对实体的永久引用(我理解为DB中的外键),只要对象不存储该引用,就可以将对此类实体的引用(例如作为方法参数)临时传递给它。那么,只要没有其他实体与PoI有链接,直接返回PoI有什么错呢?你一定是指Evans?你说得对,我说得很糟糕,我的意思是“直接引用PoI而不从其根获取它”,这可能会导致不变的强制执行和一致性问题。我还发现CityRepository.findPointOfInterestById()比City.findPointOfInterestById()或City.pointsofinterestbyid[id]更麻烦、更错位。。。