![](/img/trans.png)
[英]Where the validation should be done in a 3 layers Entity-Repository-Service application?
[英]Should entity hold reference to repository?
假设我们有class Home
并且我们希望收集该家中所有Cats
,但是我们也希望拥有Cats
常规存储库,其中包含世界上所有可用的cats。 Home
应该保留对Cats
特定存储库(或集合)的引用,还是应该在常规存储库中进行其他查找?
从域驱动的设计角度来看,您不应在另一个AR实例中包含一个聚合根(AR)实例,并且通常情况下,该实例也不会引用任何实体中的存储库。
因此,如果Home
和Cat
都是AR,则Home
应该只包含Cat
ID列表或分别代表一只猫的值对象(VO)列表,例如,包含Id
以及Name
HomeCat
。 由于HomeRepository
将负责Home
和HomeCat
持久性,因此这也有利于Home
AR的持久性。
我必须承认,这是当诸如Cat
的Entity
包含在多个AR中时有点奇怪的地方。 但是,你仍然没有在家里对象猫仓库,而是有HomeRepository
利用的CatRepository
检索有关家庭实例时。
由于Java基于引用,因此您可以保留两个集合而不会造成严重损害。
您需要确保您家中的每只猫也都在“世界”中。 这里的问题是,如果您家中的猫变化很大,则需要进行几次查找,因此您应该选择一种数据结构,数据可以根据需要尽快启用(我在考虑hashMaps ..)
使用两个收藏夹可以使您尽快找到家中的猫。 但是同步集合可能是个问题。 在这种情况下,您可以考虑观察者模式:家庭观察世界,如果猫死了,它会检查它是否在家庭内部,然后删除...
有很多方法可以执行您所要求的操作,您需要做的只是考虑什么是频率更高的操作,以及您的一般需求。 如果收藏很小,那么拥有一个收藏并通过查找来找到猫的家就没有问题...
很难用虚构域来回答DDD问题(或至少很少有关它的信息),因为DDD只是按照其原样对域进行建模并保持其不变性的完整性。
据我所知,您没有适用于Home
和Cat
之间关系的任何不变式,因此您不需要Home
的一致性边界内的Cat
对象集合。 您可以简单地拥有两个聚合根( Home
和Cat
),而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.