DDD:可以在聚合根中包含实体列表

时间:2012-12-20 10:47:52

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

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

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

1)在聚合根(AviaTicketSearchResult)中包含Fare列表是否可以?

另一个问题是我应该在AirlineCompany内为Fare设置过滤功能。每个票价都有一个行程,每个行程都有一个变种列表(AirlineCompany)(不同的腿,旅行等)。当我接受过滤器时,我应该更新ItineraryVariant并删除不必要的AirlineCompany或删除不必要的Fare内部具体ItineraryVariant

2)如何应用过滤能力?

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

2 个答案:

答案 0 :(得分:4)

我认为Domain-Driven Design不适合这里。据我所知,你只是在谈论用户界面的几个DTO以及一些过滤它们的方法。

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

或者,正如Eric Evans所说:

  

专注于核心领域

答案 1 :(得分:1)

  

1)在聚合根目录中包含票价列表是否可以   (AirlineCompany)?

是的,特别是如果AirlineCompany真的是你的聚合根,可能就是这种情况。从您的问题来看,我认为您可以从了解有关问题域的更多信息中获益。 AirlineCompany真的应该是聚合根,还是只是客户的名字?也许Fare应该是聚合根,而AirlineCompany应该只是Fare上的字符串属性。注意不要过度建模并专注于问题域。如果您的客户是购买门票的人,我怀疑他们是关注AirlineCompany,因为他们是票价和行程。在对问题域进行建模时,应暂时忘记JSON和VO之类的内容。

  

2)如何应用过滤能力?

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