如何在不知道映射器的情况下延迟加载模型属性?

时间:2013-06-02 08:35:40

标签: php design-patterns

我的域模型对其持久性一无所知,除非涉及延迟加载。

为了延迟加载一个属性,它至少需要知道工厂(而且这个工厂有mappers的知识),我想不出任何真正可行的替代方案。我或许可以使域对象可观察,并且有一个服务来进行加载,但这似乎需要很多努力才能获得很少的收益。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

原则上,持久性不是域模型本身的业务。从域模型中分离持久性的关注,包括属性是懒惰还是急切地呈现。这应该是imao,是你所有工作的标准做法。一劳永逸地解决持久性问题,并且无需担心以后创建模型。

答案 1 :(得分:0)

好的,所以我找到了一个优雅的解决方案,适用于延迟加载属性是多值的(99.9%的情况)。 Dasprid在他的网站http://site.svn.dasprids.de/trunk/application/上有它。 (请参阅App_Model_Relation类)。

基本上,当映射器构造组合对象(即“1对多”关系中的“1”)时,它会使用实现iteratorAggregate接口的类填充多值字段。此对象的内部迭代器是一个集合,但只在需要时(即在外部迭代器上调用__call()时)实例化集合。

另一种可行的方法是使用Matt Zandstra在他的优秀书籍“PHP对象,模式和实践”(Apress)中描述的“延迟集合”。在这种情况下,该集合使用PDO语句进行准备,该语句使其能够在调用时获取基础数据。

所以,现在我的模型可以完全没有持久性细节。 Yeehaaa!