【发布时间】:2012-05-14 14:24:44
【问题描述】:
我正在就聚合根和使用导航属性遍历子对象进行辩论。
场景 1:
- 客户是聚合根
- 地址是一个实体
- 联系人是一个实体
一个客户可以有多个地址,一个地址可以有多个联系人。我使用客户 ID 查询下面的客户存储库并返回一个客户对象。
Dim customer as Customer = _customerRepository.GetById(request.Id)
如果我们需要访问客户地址,我们将遍历客户对象中的地址,如下所示。
Dim address as Address = customer.RetrieveAddress(request.AddressId)
然后将针对 x 个子对象执行此方法。我展示的示例很简单,但就包含数百万条记录的数据库表而言,一旦查询并返回聚合根对象,其他人在遍历多个子对象时如何处理性能问题?
场景 2:
与上面的示例相同,但我们不是查询客户存储库并返回客户对象,而是返回一个子对象。
Dim address as Address = _customerRepository.GetAddressById(request.AddressId)
现在,因为我们已经查询了地址对象,这意味着我不必遍历客户对象来获取它。即使我已经使用客户存储库直接查询地址表并返回地址对象,在遵循 DDD 时是否允许这样做?或者我应该使用方案 1 来查询客户存储库并返回作为聚合根的客户对象并遍历子对象?
我问的原因是因为在我们的数据库图中,我们有几个表要从我们的聚合根遍历,并且随着时间的推移它可能包含数百万条记录,这会降低性能。
只是想知道其他人如何在不降低性能的情况下彻底应用 DDD,因为在使用带有导航属性的 EF 时,一旦您使用它们,它就会为每个子对象发送一个查询,如果它在其中,则可能发送 100 多个查询一个 for 循环。
迈克
【问题讨论】:
标签: asp.net-mvc entity-framework repository domain-driven-design