【问题标题】:DDD, Abstract class, Aggregates and Repository, one or many repository?DDD,抽象类,聚合和存储库,一个或多个存储库?
【发布时间】:2019-01-17 12:32:27
【问题描述】:

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

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

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

或者

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

【问题讨论】:

  • 为什么需要所有的聚合都从同一个类继承?
  • 主要是因为它们相同但生命周期不同。参考我的示例,PaperBag 可以回收,而PlasticBag 不能。所以我的类共享它们的大部分属性,但有不同的方法/操作。

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


【解决方案1】:

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

Parnas, 1972

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

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

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

【讨论】:

  • 谢谢。所以像往常一样,这取决于.. 与此同时,我正在评估为每种类型制作单独的模块(包)的想法。你的链接(谢谢)是一个很好的想法。为避免重复,我将从一个唯一的存储库开始,但请记住在模块中拆分每种类型的可能性。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多