2011-05-12 59 views
3

根据www.dofactory.com和www.blackwasp.com,虚拟代理用于呈现复杂对象的简化版本。只有在需要对象的细节时,实际上才会填充主对象,从而提供一种延迟加载的形式。这意味着什么时候使用使用延迟加载,我们可以称之为虚拟代理?除了当我们使用昂贵的物体时,除了其他原因外,我们还应该使用它吗?我没有生动地看到它。有人可以给出一个很好的解释吗?什么是虚拟代理?

+1

我会说虚拟代理的好用非常少见。大多数代理不是虚拟的或缓存的部分原因是这种策略增加了复杂性。 – 2011-05-12 07:41:08

+0

@PeterLawrey你有没有实现过数据映射器和延迟加载?有了数据映射器,你实际上永远不会使用延迟加载? – 2012-02-06 08:44:09

+0

我已经实施了虚拟代理和没有虚拟代理。我倾向于使用生成代码而不是代理来生成代码。相反,我倾向于使用虚拟代理(通过模拟库)进行测试。虚拟代理比较省力。 – 2012-02-06 08:56:56

回答

2

我从来没有觉得有必要这样做,但你可以使用虚拟代理lazily initialize expensive object graphs。但是,你应该很少需要这样做。

+0

这意味着你从未使用过懒加载?您总是从数据映射器获取完整的对象图(仅适用于所需的数据)? – 2012-02-06 08:42:18

+1

懒惰加载导致N + 1问题,所以我避免它。更好地明确你所提取的内容。 – 2012-02-06 10:59:28

+0

对我而言,创建一些数据库表连接并将其与另一个select/join合并(然后填充对象)有时会更快(或更快)。在这种情况下,如果代理被实现,它可以避免第二个查询合并,因为它已经存在于代理中(在分离的查询上执行的关系)。你有没有想过这种情况?在这种情况下,没有任何问题,因为查询分隔正是由于性能和响应时间。在深入探究@PeterLawrey上述说法(quest.comment)之前,这也值得作为一种测试方法。 – 2012-02-08 12:44:13