我有一个关于存储库和实体的重要问题。我应该限制存储库来创建特定的实体/聚合根(通过像BaseRepository这样的通用存储库)吗?
此时,基本存储库可以访问数据库工厂对象(不是DbFactory而是自定义)来检索任何POCO(不仅仅与聚合根相关)。因此,从技术上讲,我可以从任何存储库创建任何实体。显然,作为程序员,我不做,但它绝对可能。那么,是否有必要限制存储库并允许它创建特定的实体?请注意,某些实体也有子实体。那么,如果我限制存储库创建一个实体(通过BaseRepository),那么如何创建子实体?
答案 0 :(得分:2)
正如@Jonas在他的回答中建议的那样,我将为每个聚合根创建一个一个存储库。这些应隐藏所有持久性细节。这意味着将域实体作为参数并返回域实体。通常从存储库中的ORM实体映射到域实体。作为副作用,这也可以让您考虑所需的数据,减少DDD中处理具有延迟加载属性的实体时可能遇到的一些恐怖。
我会避免使用通用存储库模式,就像您在原始帖子中所说的那样,在DDD中您希望代码记录您的设计意图,您不希望提供允许客户端的代码/ callers从数据库加载任何实体。此外,您的大多数实体很可能是从许多表/资源构建的,这不适用于通用存储库模式。
答案 1 :(得分:1)
我会认为在Bounded Context中为每个聚合根创建一个Repository。
它将明确显示您的应用程序中的聚合根与(子)实体相对应的内容。通过这种方式,您可以保护自己和他人免受通过存储库访问和使用聚合的方式的伤害。