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