DDD中的存储库应该返回什么

问题描述 投票:0回答:3

我研究了DDD中的存储库,发现了很多不同的东西。每个人对存储库的说法都不尽相同,这让我感到困惑。

我想知道

  1. 存储库应包含哪些方法?
  2. 存储库肯定会(或更接近)返回什么?

谢谢。

repository domain-driven-design ddd-repositories
3个回答
0
投票

Eric Evans在2003年创造了“域驱动设计”;因此在该上下文中任何定义的正确起点是his book。他在第6章(“域对象的生命周期”)中定义了存储库模式。

一个存储库将一种类型的所有对象表示为一个概念集(通常是模拟的)。除了具有更复杂的查询功能外,它的作用类似于集合。添加和删​​除适当类型的对象,存储库后面的机器将其插入或从数据库中删除。

...

对于需要全局访问的每种类型的对象,创建一个可以提供该类型所有对象的内存中集合的幻觉的对象。

存储库的主要用例:给定密钥,返回正确的根实体。存储库实现充当模块,它隐藏了您选择的持久性策略(请参阅:Parnas 1971)。


0
投票

对于每个聚合根(AR),您都应该有一个存储库。至少,存储库可能具有void Save(Aggregate aggregate)Aggregate Get(Guid id)方法。返回的聚合将始终完全构成。

我有时会为特定用例添加方法,以便仅更新某些数据位。例如,类似void Activate(Guid id)之类的东西。这仅仅是为了避免处理不必要的数据。

在存储库上进行查询通常会出现问题,因为通常应避免查询您的域。对于这种情况,我的建议是使用查询机制,它比域对象或对象图更接近数据,且格式更原始。查询机制将更可能返回原语,例如int Count(Query.Specification specification)或返回read model实例的列表。


0
投票

是的,资源库在不同的上下文中具有不同的含义-许多作者都有自己的解释。我对它们的理解是从多个角度进行的:

  • 他们抽象出下划线的存储类型
  • 他们可以将接口引入到更接近领域模型的地方
  • 它们代表对象的集合,因此可以作为汇总内存中存储(相关对象的集合)
  • 它们代表相关对象的交易边界。
  • 它们不能包含重复项,例如集合。
  • 对于存储库仅包含一个对象,不包含任何对象是有效的内部复杂关系

因此,为回答您的问题,存储库应包含与集合相关的方法,例如add,remove,addAll,findByCriteria-而不是保存,更新,删除。它们可以返回整个聚合或部分聚合或某些内部聚合关系-这取决于您的域模型和您表示对象的方式

© www.soinside.com 2019 - 2024. All rights reserved.