域驱动设计中每个根聚合实体的一个存储库

Eli*_*eth 8 domain-driven-design aggregateroot repository-pattern

如果您遵循存储库模式,他们会说...为每个根聚合实体创建一个存储库.

这意味着当我有这个模型时:

客户有订单订购有产品有供应商

等等...

这意味着我有4个存储库被放入一个回购.客户是根实体.

我在这里误解了什么吗?

eul*_*rfx 9

每个聚合应该有一个存储库是正确的.但是,可以改变的是您域中的聚合集.客户/订单/产品/供应商模型可以通过多种方式分解为聚合.分解为聚合体取决于多种因素,并且取决于手头的域.

聚合应该是一致性边界,这意味着它定义了哪些实体集在与这些实体关联的行为的上下文中应该是一致的.鉴于此约束,应消除聚合之间的对象引用,并用身份引用替换.

在您的模型中,客户,订单,产品和供应商可能是不同的聚合,因此需要单独的存储库.即使客户是聚合根(客户聚合的一部分),订单依赖于客户,但这并不意味着客户存储库应包含订单存储库.订单存储库应该是完全独立的,因为订单是订单聚合的根.

参阅Vaughn Vernon的Effective Aggregate Design,深入了解如何设计聚合体.