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 警察都不会来敲你的门。但将两者分开可以使代码 更易于更改 ,这是 属性 可持续成功的重要因素。
在这样的场景下,我会问自己这些问题-
- 它们代表不同的交易吗?
- 引发的事件会因类型而异吗?
第一个问题的答案本身通常会导致合理的聚合设计。
在您的具体示例中,由于只有类型不同,我认为它们可以在同一事务中创建。此外,引发的事件不会因类型而异,因此拥有一个存储库会更好。
思考 存储库 和 聚合 。文献中说每个聚合有一个存储库。
但是,如果我的聚合都是基础聚合的子 类(是一种关系,继承不用于重用)。我是否必须为所有子 类 创建存储库,或者我可以为所有子使用相同的存储库。
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 警察都不会来敲你的门。但将两者分开可以使代码 更易于更改 ,这是 属性 可持续成功的重要因素。
在这样的场景下,我会问自己这些问题-
- 它们代表不同的交易吗?
- 引发的事件会因类型而异吗?
第一个问题的答案本身通常会导致合理的聚合设计。
在您的具体示例中,由于只有类型不同,我认为它们可以在同一事务中创建。此外,引发的事件不会因类型而异,因此拥有一个存储库会更好。