【问题标题】:DDD: is it ok to contain list of entity inside an aggregate rootDDD:是否可以在聚合根中包含实体列表
【发布时间】:2012-12-20 23:51:06
【问题描述】:

我正在开发一个用于搜索机票的客户端应用程序。我从服务器获得了一个带有搜索结果的 JSON,我应该将此结果表达给客户端。

假设我有一个FareAirlineCompanyAviaTicketSearchResult 对象。 AviaTicketSearchResult 应该包含 AirlineCompany 对象的列表。每个AirlineCompany 应该包含Fares。而且我猜AviaTicketSearchResultAirlineCompany 是一个聚合根,因为我有级联删除的规则,当我删除AirlineCompany 时,删除所有与AviaTicketSearchResult 相同的航空公司票价是有意义的。

1) 可以在聚合根 (AirlineCompany) 中包含 Fares 的列表吗?

另一个问题是我应该对Fares 在AirlineCompany 中具有过滤能力。每个票价都有一个行程,每个行程都有一个变体列表 (ItineraryVariant)(不同的航段、旅行等)。当我接受过滤器时,我应该更新我的AirlineCompany 并删除不必要的Fares 或删除混凝土Fare 内不必要的ItineraryVariant

2) 过滤能力如何应用?

我假设每次应用过滤器时我应该将 Fare 表示为 VO 并从原始数据 (json) 重新创建 Fare 对象,然后在使用过滤后的 AirlineCompany 更新 AviaTicketSearchResult 后将其添加到 AirlineCompany。

【问题讨论】:

    标签: oop design-patterns architecture domain-driven-design


    【解决方案1】:

    我认为领域驱动设计在这里并不合适。据我所知,您只是在谈论一些用于 UI 的 DTO 以及一些过滤它们的方法。

    当您试图掌握(和建模)复杂行为时,领域驱动设计会派上用场。视图模型或 DTO 应该尽可能简单。大多数情况下,不需要复杂且耗时的建模工作。

    或者,正如埃里克·埃文斯所说:

    专注于核心领域

    【讨论】:

    • 我已经用服务层包装了我的域模型,UI 有一个对 ServiceFacade 的引用,它将 DTO 对象返回给 UI。
    • 而且这个任务只是复杂应用程序的一部分。显示结果后,用户应选择具体票价并使用所选票价创建订单。
    • @tikhop 正如您所说,这是复杂应用程序的一部分,DDD 可能应用于应用程序的其他部分,特别是处理订单创建的部分。然而,这个特定部分不涉及聚合和 VO。您有可能对应于聚合的 DTO,但它们本身并不是聚合。因此,您可以以最能代表数据的方式构建 DTO - 只是基本的 OOP。您无需担心一致性边界、持久性等问题。
    【解决方案2】:

    1) 是否可以在聚合根中包含票价列表 (航空公司)?

    是的,尤其是如果 AirlineCompany 确实是您的聚合根(可能是这种情况)。从您的问题中,我认为您可能会从更多地了解问题域中受益。 AirlineCompany 真的应该是聚合根还是只是客户的名称?也许 Fare 真的应该是聚合根,而 AirlineCompany 应该只是 Fare 上的字符串属性。注意不要过度建模并专注于问题域。如果您的客户是购买机票的人,我怀疑他们是否像关注票价和行程一样关注 AirlineCompany。在对问题域进行建模时,应该暂时忘记 JSON 和 VO 之类的东西。

    2) 过滤能力如何应用?

    您的存储库或域服务应负责根据过滤器参数过滤结果。这取决于您的实施。但是,通常,如果客户端正在与服务器通信,则服务器将运行存储库应用程序代码,根据您的实现,该代码可以将其传递到 db 服务器,从而使您获得最佳性能,这样您就不会通过周围的无关数据。

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 2016-11-05
      • 2011-06-20
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多