DDD -限制存储库只创建特定的实体

本文关键字:创建 实体 存储 DDD | 更新日期: 2023-09-27 18:10:10

我有一个关于存储库和实体的重要问题。我是否应该限制存储库来创建特定的实体/聚合根(通过像BaseRepository这样的通用存储库)?

此时,基本存储库可以访问数据库工厂对象(不是DbFactory而是custom)来检索任何POCO(不只是与聚合根相关)。从技术上讲,我可以从任何存储库创建任何实体。显然,作为一名程序员,我不会这么做,但这绝对是可能的。那么,是否有必要限制存储库并允许它创建特定的实体呢?注意,一些实体也有子实体。所以,如果我限制存储库创建一个实体(通过BaseRepository),那么如何创建子实体?

DDD -限制存储库只创建特定的实体

正如@Jonas在他的回答中建议的那样,我将为每个聚合根创建一个存储库。这些应该隐藏所有持久性细节。这意味着将域实体作为参数并返回域实体。通常从ORM实体映射到存储库中的域实体。作为一个副作用,这也使您考虑需要哪些数据,从而减少了在DDD处理具有惰性加载属性的实体时可能遇到的一些可怕问题。

我会避免通用存储库模式,就像你在原来的帖子中说的,在DDD中,你希望你的代码记录你的设计意图,你不想提供允许客户端/调用者从你的数据库加载任何实体的代码。而且,大多数实体很可能是从许多表/资源构建的,这不适用于通用存储库模式。

我认为在你的Bounded Context中为每个聚合根都有一个Repository是很清楚的。

这将使聚合根在应用程序中与(子)实体相对立。通过这种方式,您可以保护自己和其他人免受影响通过存储库访问和使用聚合的方式。