我研究了DDD中的存储库,发现了很多不同的东西。每个人对存储库的说法都不尽相同,这让我感到困惑。
我想知道
谢谢。
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)
或返回read model实例的列表。
是的,资源库在不同的上下文中具有不同的含义-许多作者都有自己的解释。我对它们的理解是从多个角度进行的:
因此,为回答您的问题,存储库应包含与集合相关的方法,例如add,remove,addAll,findByCriteria-而不是保存,更新,删除。它们可以返回整个聚合或部分聚合或某些内部聚合关系-这取决于您的域模型和您表示对象的方式