我的域模型对它的持久性一无所知,除了延迟加载。
为了延迟加载属性,它至少需要了解工厂(并且该工厂了解映射器),我想不出任何真正可行的替代方案。我也许可以使域对象可观察,并让服务进行加载,但这似乎付出了很多努力却收效甚微。
我错过了什么?
我的域模型对它的持久性一无所知,除了延迟加载。
为了延迟加载属性,它至少需要了解工厂(并且该工厂了解映射器),我想不出任何真正可行的替代方案。我也许可以使域对象可观察,并让服务进行加载,但这似乎付出了很多努力却收效甚微。
我错过了什么?
原则上,持久性不是领域模型本身的业务。将持久性的关注点从领域模型中分离出来,包括属性是延迟呈现还是急切呈现。这应该是,imao,你所有工作的标准做法。一劳永逸地解决持久性问题,然后无后顾之忧地创建模型。
好的,所以对于延迟加载的属性是多值的情况(99.9% 的情况),我找到了一个优雅的解决方案。Dasprid 在他的网站http://site.svn.dasprids.de/trunk/application/上有它。(参见 App_Model_Relation 类)。
基本上,当映射器构造组合对象(即“一对多”关系中的“1”)时,它会使用实现iteratorAggregate
接口的类填充多值字段。该对象的内部迭代器是一个集合,但该集合仅在需要时实例化(即在__call()
外部迭代器上调用时)。
另一种可行的方法是使用 Matt Zandstra 在他的优秀著作“PHP 对象、模式和实践”(Apress) 中描述的“延迟集合”。在这种情况下,集合使用 PDO 语句进行初始化,使其能够在调用它时获取基础数据。
所以,现在我的模型可以完全没有持久性细节。耶哈!