DDD:聚合根特化

Ric*_*ald 3 service inheritance domain-driven-design

我有一个Order带有相应OrderService和的聚合根OrderRepository

我有一个ExtendedOrder对应的ExtendedOrderServiceand ExtendedOrderRepository

例如:

class Order {
   int GetOrderId();
}

class ExtendedOrder : Order {
   string GetExtendedInfo();
}
Run Code Online (Sandbox Code Playgroud)

我想有OrderService返回类型都是OrderExtendedOrder作为一个列表Order。但要获得ExtendedOrder它应该要求相应的ExtendedOrderServiceOrder是类型ExtendedOrder

是否有可能获得这种行为?让一个聚合根扩展另一个聚合根是否合法?

aut*_*att 5

您不需要 ExtendedOrderService。只需使用一个 OrderService 来协调来自 OrderRepository 和 ExtendedOrderRepository 的结果。

有关应用程序服务的作用的更多信息,请参阅此问题答案。一个应用服务可以使用多个存储库。


kst*_*uch 5

主要问题是,你需要它做什么。我怀疑它与某种用户界面或报告功能有关。如果是这种情况,我的建议是不要对这些查询使用域模型概念。

换句话说,将域模型概念与报告相关的查询分开(对于保持一致性和实现对复杂业务逻辑的控制非常有用)(在 UI 上呈现结果毕竟是报告的一种形式)。在某些时候未能进行这种分离总是会导致调整域模型以满足某种 UI 或报告的要求,而这种情况不应该发生。

在您的情况下,我只需准备一个忽略聚合并选择我需要的所有数据的查询。当然,当要对结果执行某些业务操作时,应该使用域模型。毕竟,聚合负责保持一致性,唯一有机会扰乱一致性的是更新数据——读取数据不会导致更改,因此在我看来,使用聚合进行读取是毫无意义的。

综上所述,大多数情况下与报告相关的功能不应导致域模型业务概念的调整。