DDD,抽象类,聚合和存储库,一个还是多个存储库?

时间:2019-01-17 12:32:27

标签: domain-driven-design abstract-class ddd-repositories aggregateroot

存储库聚合的思考。文献说每个聚集体只有一个存储库。

但是,如果我的聚合是基类的所有子类(is-a关系,则继承不会用于重用)。我是否必须在所有子类的存储库上创建,还是可以对所有子类使用相同的存储库?

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

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

2 个答案:

答案 0 :(得分:1)

在应用程序级别,您通常希望每个聚合有一个存储库。这样做的动机是您试图将与实现细节有关的代码量减到最少。

请参见Parnas, 1972

因此在客户端代码中,首选这种样式:

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

这样做吗?否。Parnas和DDD警察都不会踢您的门。但是,将两者分开将使代码变得更容易更改,这是实现可持续成功的重要属性。

答案 1 :(得分:0)

在这种情况下,我会问自己这些问题-

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

回答第一个问题本身通常会导致合理的总体设计。

在您的特定示例中,由于只有类型不同,我认为可以在同一事务中创建它们。同样,引发的事件在不同类型之间不会有所不同,因此拥有一个存储库会更好。