【发布时间】:2020-04-01 16:41:05
【问题描述】:
我研究了 DDD 中的存储库,发现了太多不同的东西。每个人对存储库的看法都不一样,这让我很困惑。
我想知道:
- 存储库应包含哪些方法?
- 存储库应该明确(或更接近)返回什么?
谢谢。
【问题讨论】:
标签: repository domain-driven-design ddd-repositories
我研究了 DDD 中的存储库,发现了太多不同的东西。每个人对存储库的看法都不一样,这让我很困惑。
我想知道:
谢谢。
【问题讨论】:
标签: repository domain-driven-design ddd-repositories
Eric Evans 在 2003 年创造了“领域驱动设计”;因此,该上下文中任何定义的正确起点是his book。他在第 6 章(“域对象的生命周期”)中定义了存储库模式。
一个存储库将一个类型的所有对象表示为一个概念集(通常是模拟的)。它就像一个集合,除了更精细的查询能力。添加和删除适当类型的对象,存储库后面的机器将它们插入或从数据库中删除。
...
对于需要全局访问的每种类型的对象,创建一个可以提供该类型所有对象的内存集合假象的对象。
存储库的主要用例:给定一个键,返回正确的根实体。存储库实现充当一个模块,它隐藏了您选择的持久性策略(请参阅:Parnas 1971)。
【讨论】:
对于每个聚合根 (AR),您都应该有一个存储库。至少,存储库可能有一个void Save(Aggregate aggregate) 和一个Aggregate Get(Guid id) 方法。返回的聚合将始终完全构成。
我有时会为特定用例添加方法,以便仅更新某些数据位。例如,void Activate(Guid id) 之类的东西。这只是为了避免处理不必要的数据。
查询存储库通常是有问题的,因为您通常应该避免查询您的域。对于这种情况,我的建议是使用比域对象或对象图更接近数据且格式更原始的 查询机制。查询机制更有可能返回原语,例如int Count(Query.Specification specification),或者可能返回读取模型实例的列表。
【讨论】:
您是对的,存储库在不同的上下文中具有不同的含义 - 许多作者都有自己的解释。我理解他们的方式是从多个角度:
因此,为了回答您的问题,存储库应包含与集合相关的方法,例如添加、删除、addAll、findByCriteria - 而不是保存、更新、删除。它们可以返回整个聚合或部分聚合或一些内部聚合关系 - 这取决于您的域模型和您想要表示对象的方式
【讨论】: