两个组件提供相同的功能,但依赖关系不同


9

我正在使用Zend Framework 1和Doctrine2作为ORM层在PHP中构建应用程序。一切进展顺利。现在,我偶然发现ZF1和Doctrine2都附带并依赖于它们自己的缓存实现。我对两者都进行了评估,虽然每个人都有自己的优点和缺点,但就我的简单需求而言,它们都不比其他人优越。这两个库似乎都是针对各自的接口而不是针对其实现编写的。

我之所以认为这是一个问题,是因为在应用程序的引导过程中,我必须配置两个缓存驱动程序-每个都有自己的语法。这样很容易造成不匹配,因此,与缓存后端建立两个连接的效率很低。

我正在尝试确定最佳的前进方式,并欢迎您可能提供的任何见解。

到目前为止,我想到的是四个选择:

  1. 不执行任何操作,请接受存在两个提供缓存功能的类。
  2. 创建一个Facade类,将Zend的接口粘贴到Doctrine的缓存实现上。
  3. 选项2的另一种方法-创建一个Facade,以在Zend Framework后端上映射Doctrine的界面。
  4. 使用多接口继承创建一个接口来统治所有接口,并祈祷不存在任何重叠(即:如果两个都有“保存”方法,由于PHP的原因,它们将需要以相同的顺序接受参数)缺乏适当的多态性)。

哪个选项是最佳选择,或者我不知道有没有“以上所述”变体?


3
对于不了解PHP,ZF或Doctrine的人们,也许您应该从更一般的软件设计角度来描述问题。这两个库是否在缓存相同的东西?如果是这样,为什么不禁用一个缓存?如果没有,那是什么问题?诸如此类的事情。
idoby

以前,我曾使用过具有自己的ORM和数据库访问缓存提供程序的.NET CMS。然后,我不得不将CMS与我们的业务平台集成,该业务平台使用了完全不同的缓存提供程序。这给我们带来了一个问题,因为当我们的业务平台缓存提供程序可以扩展时,CMS中的缓存提供程序无法扩展到Web场。但是您面临什么问题?
CodeART

看一下Symfony2以及他们如何解决这个问题。
nietonfir 2013年

Answers:


7

不执行任何操作接受单独的项目可以具有冗余,只要它们在自己的空间中工作即可(不会污染彼此的缓存)。主义知道Zend具有缓存功能,但是他们不想依赖Zend,反之亦然。并非所有人都希望使用Zend和Doctrine。

我会让Doctrine代码使用其自己的东西,并为其他所有内容使用ZF。这样,我只需要了解ZF类。教义缓存只能由教义在内部用于数据库对象。ZF具有更多在ORM之外有用的前端,例如html页面缓存前端。

创建另一层将是理想的选择,但它将为项目添加另一个依赖项,因此对于维护而言不是很好。

我知道,在引导程序中,设置多个缓存可能显得多余。如果尝试同时使用ZF1,Doctrine和ZF2,情况可能会变得更糟。但这是一个非常小的恒定时间,因为它们仅设置变量,尚未连接到后端。

因此,从编程,维护和操作的角度来看,我将不理会它们。


3

我之所以认为这是一个问题,是因为在应用程序的引导过程中,我必须配置两个缓存驱动程序-每个都有自己的语法。这样很容易造成不匹配,因此,与缓存后端建立两个连接的效率很低。

为什么不仅仅从“使配置更方便”的角度解决问题呢?

换句话说,编写一些接受您的配置数据的新类,然后将其应用于两个缓存驱动程序。当然,它不那么灵活,但这也意味着更少的错误。


0

为什么不创建可以专用于每个框架的接口抽象呢?我将使用所需的方法编写自己的缓存控制器,该方法将封装两个缓存。然后,我可以忘记它们,而只与我的控制器交谈。该解决方案有任何问题吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.