我们举个例子,我们有两个实体:ServiceProvider
和TelephoneNumber
。该系统允许服务提供商添加电话号码。服务提供商添加的每个电话号码由TelephoneNumber
的实例表示。所以,我在这两个实体之间有关联。目前,我已经确定TelephoneNumber
实例只与一个服务提供商相关联。我还决定这两个实体属于同一个聚合,ServiceProvider
是聚合根(一个参数是TelephoneNumber
生命周期取决于ServiceProvider
实体)。
我的问题是关于协会的遍历方向。我事先知道服务提供商可能会增加数百万个电话号码。
如果关联的遍历方向是从ServiceProvider
到TelephoneNumber
,如何以有效的方式实施?在ServiceProvider
实体中存储一组电话号码效率低(特别是对于内存)。可以使用延迟加载,但它会通过使用支持它的框架(例如Hibernate)来限制实现选项。
在我们拥有Customer
和Order
个实体的已知示例中,通常会选择从Order
到Customer
的单向关联。如果关联的遍历方向是从TelephoneNumber
到ServiceProvider
,那么如何实现TelephoneNumber
的CRUD操作?我想我们需要使用TelephoneNumberRepository
?但是,我经常看到应该只为聚合根定义存储库,因为我们通常得到聚合根实例,并通过它与域模型进行通信。
由于
答案 0 :(得分:1)
由于您需要根据某些标准访问电话号码,即使不是聚合根,我也不会惊讶地看到PhoneNumberRepository。
另一方面,您可以直接在ServiceProvider中使用适当的FindPhoneNumberBy ...()方法。困扰我的是你不能同时在内存中加载大量的电话号码,这意味着你必须在ServiceProvider中引入某种性能管理(延迟加载/枚举等),打破关注点的分离
单独的存储库的优点是,虽然接口将位于Domain层中,但其具体实现将驻留在Infrastructure层中,这很好地将FindPhoneNumberBy ...()方法的约定与基础提取技巧分离。总而言之,我无法真正看到比存储库更合理的候选人来处理这类事情。