繁体   English   中英

实体应持有对存储库的引用吗?

[英]Should entity hold reference to repository?

假设我们有class Home并且我们希望收集该家中所有Cats ,但是我们也希望拥有Cats常规存储库,其中包含世界上所有可用的cats。 Home应该保留对Cats特定存储库(或集合)的引用,还是应该在常规存储库中进行其他查找?

从域驱动的设计角度来看,您不应在另一个AR实例中包含一个聚合根(AR)实例,并且通常情况下,该实例也不会引用任何实体中的存储库。

因此,如果HomeCat都是AR,则Home应该只包含Cat ID列表或分别代表一只猫的值对象(VO)列表,例如,包含Id以及Name HomeCat 由于HomeRepository将负责HomeHomeCat持久性,因此这也有利于Home AR的持久性。

我必须承认,这是当诸如CatEntity包含在多个AR中时有点奇怪的地方。 但是,你仍然没有在家里对象猫仓库,而是有HomeRepository利用的CatRepository检索有关家庭实例时。

由于Java基于引用,因此您可以保留两个集合而不会造成严重损害。

您需要确保您家中的每只猫也都在“世界”中。 这里的问题是,如果您家中的猫变化很大,则需要进行几次查找,因此您应该选择一种数据结构,数据可以根据需要尽快启用(我在考虑hashMaps ..)

使用两个收藏夹可以使您尽快找到家中的猫。 但是同步集合可能是个问题。 在这种情况下,您可以考虑观察者模式:家庭观察世界,如果猫死了,它会检查它是否在家庭内部,然后删除...

有很多方法可以执行您所要求的操作,您需要做的只是考虑什么是频率更高的操作,以及您的一般需求。 如果收藏很小,那么拥有一个收藏并通过查找来找到猫的家就没有问题...

很难用虚构域来回答DDD问题(或至少很少有关它的信息),因为DDD只是按照其原样对域进行建模并保持其不变性的完整性。

据我所知,您没有适用于HomeCat之间关系的任何不变式,因此您不需要Home的一致性边界内的Cat对象集合。 您可以简单地拥有两个聚合根( HomeCat ),而Cat可以通过identity引用它的Home

您可以使用CatRepository查询特定家中的所有猫,也可以独立于家而查询所有猫。

重要的是不要在模型中放置人为约束。 例如,如果您仅出于保持关系的原因而在Home内保留Cat身份的集合,那么您就在限制系统的可伸缩性:尝试将新的Cat关联到同一Home两个同时事务将失败,并发无缘无故的异常(假设乐观并发)。

如果Cat必须由自己的总访问的聚合根CatRepository ,那么它应该被包括在Home总。 您的“ Home实体应按身份而不是参考来引用关联的Cat实体。

这是一个总体设计问题,需要仔细查看您的域以及如何使用实体。 您可能会问自己一个问题:“如果我删除Home ,是否还应删除所有Cat实体?” 不要过分强调这个问题。 还有其他重要因素需要考虑。

沃恩·弗农(Vaughn Vernon)在其分为三部分的PDF系列有效聚合设计中介绍了此主题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM