实现大型集合实体而不将数据加载到内存中

时间:2013-03-18 08:13:22

标签: domain-driven-design

我正在使用 addImage $ imageId ), removeImage 等方法实现实体 UserImages (< em> $ imageId ), getImages $ from,$ count )。

Phisycally,存储在应用程序级存储中的数据(图像ID集合),提供了很好的功能,如 addItem $ keyName,$ item,$ weight ), removeItem $ keyName,$ item ), getItems $ key,$ from,$ count )。

如何使模型以DDD风格使用此外部(看起来形成域)存储,而不引用 UserImages 实体中的存储?重要的是,我不想将所有集合从存储加载到实体,正如传统方法所假设的那样。

希望我对问题提供了很好的解释,如果没有,请告诉我。非常感谢你的帮助。

2 个答案:

答案 0 :(得分:5)

UserImages听起来不像实体,但更像是服务存储库,您已经拥有了for - 应用程序级存储。您可能希望将此公开为UserImageRepository存储库是您所拥有的更合适的名称。更一般地说,每当您有一个关联的一端可能具有非常大的基数时,请考虑implementing this association as a repository而不是直接对象引用。实体和聚合应该是一致性边界,不一定是它们所代表的概念的完整形式。另外,请查看Effective Aggregate Design以深入了解此主题。

答案 1 :(得分:0)

首先,延迟加载是DDD中的反模式,当且仅当实体提供对保持其不变量所需的更多数据的访问时才需要它。要解决此问题,您可以使用shared identifiers代替。

要解除域逻辑和持久性问题,您可以使用observable entities:提供实体的存储库会不断观察它,以便在发生适当的域事件时,它可以保留更改。但是,如果您使用PHP编码,则必须手动编写观察者模式。