DDD、摘要 class、聚合和存储库,一个还是多个存储库?

DDD, Abstract class, Aggregates and Repository, one or many repository?

思考 存储库 聚合 。文献中说每个聚合有一个存储库。

但是,如果我的聚合都是基础聚合的子 类(是一种关系,继承不用于重用)。我是否必须为所有子 类 创建存储库,或者我可以为所有子使用相同的存储库。

PaperBag paperBag = paperBagsRepository.get(paperBagId);
PlasticBag plasticBag = plasticBagsRepository.get(plasticBagId);

PaperBag paperBag = bagsRepository.get(paperBagId);
PlasticBag plasticBag = bagsRepository.get(plasticBagId);

在应用程序级别,您通常希望每个聚合有一个存储库。这里的动机是您正在尝试最大程度地减少与实现细节相关的代码量。

参见Parnas, 1972

所以在客户端代码中,首选这种风格:

PaperBag paperBag = paperBagsRepository.get(paperBagId);
PlasticBag plasticBag = plasticBagsRepository.get(plasticBagId);

那样做吗?不会。Parnas 和 DDD 警察都不会来敲你的门。但将两者分开可以使代码 更易于更改 ,这是 属性 可持续成功的重要因素。

在这样的场景下,我会问自己这些问题-

  1. 它们代表不同的交易吗?
  2. 引发的事件会因类型而异吗?

第一个问题的答案本身通常会导致合理的聚合设计。

在您的具体示例中,由于只有类型不同,我认为它们可以在同一事务中创建。此外,引发的事件不会因类型而异,因此拥有一个存储库会更好。