【发布时间】:2013-01-23 05:19:36
【问题描述】:
引用来自DDD: Tackling Complexity in the Heart of Software(第 150 页)
一)
对 VALUE 的全局搜索访问通常是没有意义的,因为找到一个 VALUE 的属性相当于创建一个新实例 与那些属性。也有例外。例如,当我在 在线计划旅行,我有时会保存一些预期的行程 稍后返回以选择一个进行预订。这些行程是价值 (如果有两个由相同的航班组成,我不在乎哪个 是哪个),但它们已与我的用户名相关联,并且 完好无损地为我找回。
我不明白作者的推理,为什么让Itinierary 值对象全局可访问而不是客户端必须全局搜索Customer root entity 然后从它遍历到这个Itinierary 对象更合适?
b)
持久对象的一个子集必须可以通过一个全局访问 基于对象属性的搜索......它们通常是实体, 有时是具有复杂内部结构的 VALUE OBJECTS ...
为什么具有复杂内部结构的 Values 对象 更常见于全局可访问,而不是更简单的 Value 对象?
c) 无论如何,是否有一些关于如何确定特定值对象是否应可全局访问的一般准则?
更新:
一)
没有域理由使行程可以遍历 客户实体。如果不需要,为什么要加载客户实体 对于任何行为?查询通常最好在没有的情况下处理 使行为领域复杂化。
我可能错了,但是当用户(即客户根实体)登录时,域模型检索用户的Customer Aggregate 不是很常见吗?
如果用户可以选择预订航班,那么他们也会不时查看Itineraries(尽管英语不是我的第一语言,所以Itinerary 这个词实际上可能意味着什么与我认为的意思有点不同)他们已经选择或预订了。
既然Customer Aggregate 已经从数据库中检索到了,为什么还要在Itinerary 已经与Customer Aggregate 一起检索到它时再次对Itinerary 进行全局搜索(可能会在数据库中搜索它)?
c)
IMO 规则非常简单——如果有需要的话。它没有 取决于 VO 本身的结构,但取决于 用例需要特定的 VO。
但是这个 VO 实例必须与某个实体相关(即 Itinerary 与特定的 Customer 相关),否则正如作者指出的那样,我们可以简单地创建一个新的而不是通过其属性搜索 VO具有这些属性的 VO 实例?
第二次更新:
a) 来自您的link:
另一种表达关系的方法是使用存储库。
当通过 repository 表达关系时,您是否实现 SalesOrder.LineItems 属性(我对此表示怀疑,因为您建议不要直接调用存储库的实体),而后者又调用 repository,或者你是否实现了SalesOrder.MyLineItems(IOrderRepository repo) 之类的东西?如果是后者,那么我认为不需要SalesOrder.LineItems 属性?
b)
要记住的重要一点是聚合并不意味着 用于显示数据。
领域模型确实不关心上层将如何处理数据,但如果不使用 Application 和 UI 之间的 DTO层,那么我假设 UI 将从 聚合 中提取要显示的数据(假设我们将整个聚合发送到 UI 而不仅仅是驻留在其中的某个实体)?
谢谢
【问题讨论】: