遍历方向和性能

时间:2012-04-03 09:49:59

标签: performance domain-driven-design

我们举个例子,我们有两个实体:ServiceProviderTelephoneNumber。该系统允许服务提供商添加电话号码。服务提供商添加的每个电话号码由TelephoneNumber的实例表示。所以,我在这两个实体之间有关联。目前,我已经确定TelephoneNumber实例只与一个服务提供商相关联。我还决定这两个实体属于同一个聚合,ServiceProvider是聚合根(一个参数是TelephoneNumber生命周期取决于ServiceProvider实体)。

我的问题是关于协会的遍历方向。我事先知道服务提供商可能会增加数百万个电话号码。

如果关联的遍历方向是从ServiceProviderTelephoneNumber,如何以有效的方式实施?在ServiceProvider实体中存储一组电话号码效率低(特别是对于内存)。可以使用延迟加载,但它会通过使用支持它的框架(例如Hibernate)来限制实现选项。

在我们拥有CustomerOrder个实体的已知示例中,通常会选择从OrderCustomer的单向关联。如果关联的遍历方向是从TelephoneNumberServiceProvider,那么如何实现TelephoneNumber的CRUD操作?我想我们需要使用TelephoneNumberRepository?但是,我经常看到应该只为聚合根定义存储库,因为我们通常得到聚合根实例,并通过它与域模型进行通信。

由于

1 个答案:

答案 0 :(得分:1)

由于您需要根据某些标准访问电话号码,即使不是聚合根,我也不会惊讶地看到PhoneNumberRepository。

另一方面,您可以直接在ServiceProvider中使用适当的FindPhoneNumberBy ...()方法。困扰我的是你不能同时在内存中加载大量的电话号码,这意味着你必须在ServiceProvider中引入某种性能管理(延迟加载/枚举等),打破关注点的分离

单独的存储库的优点是,虽然接口将位于Domain层中,但其具体实现将驻留在Infrastructure层中,这很好地将FindPhoneNumberBy ...()方法的约定与基础提取技巧分离。总而言之,我无法真正看到比存储库更合理的候选人来处理这类事情。