与数据源的松散耦合

时间:2013-07-31 15:43:27

标签: php oop design-patterns architecture

首先,我很抱歉,我无法向您提供更多详细信息,而且我的问题可能听起来很普遍。

我正在开展一个小项目,但项目的要求有点紧张。我必须使数据源可切换。因此,如果我现在将数据库用作数据源,它可能能够使用Web服务或文件。

我对如何实现我的模型没有任何线索,这样我就可以在不对应用程序进行重大更改的情况下切换数据源。

我可以使用设计模式或设计实践来处理这种情况吗?

我打算使用Zend Framework。

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

使用一个声明GetModel1和GetModel2等方法的接口。创建一个从数据库中获取它的接口的实现。如果切换到服务方法,则可以为该接口编写新的实现。

通过执行此操作,您不必重写任何其他代码,因为从外部查看,具有数据库实现的GetModel1将与服务版本中的GetModel1相同,因为您可以进行调用,魔法发生在界面的另一端,你得到一个Model1作为回报。

如果在某些时候你需要在运行时切换实现(比如,离线时从数据库获取,但是从服务获得,如果可用),你可以创建类似于称为依赖注入的设计模式的东西。

答案 1 :(得分:1)

这实际上取决于你的应用程序架构,但我会给你一个通常有效的例子。

您希望将数据库调用与其余代码分离为单独的文件/类。

例如:

Person class:
getPerson -> calls PersonConnectionClass::queryForPerson($x);

在最基本的形式中,您只需在切换数据库引擎或其他数据源(即xml,平面文件等)时替换PersonConnectionClass。

只要稍微考虑一下,您就可以通过在配置文件中指定数据源来了解如何使这个更有魅力。然后使用编程逻辑确定您使用的数据源。

答案 2 :(得分:1)

我不熟悉Zen框架,但您正在寻找的设计模式是Data Access ObjectData Transfer Objects

数据访问对象用于:

  1. 摘要持久性机制
  2. 充当应用程序模型和持久性(数据库,文件系统)之间的中介
  3. 隐藏应用程序其余部分的所有数据存储详细信息
  4. 允许更改持久性机制以不影响应用程序的其余部分
  5. 在不了解项目的太多细节的情况下,我建议实现数据访问接口,然后根据持久性的类型实现具有不同数据访问对象的接口。

答案 3 :(得分:1)

查看DAO s(数据访问对象)。最初它存在于j2ee世界,但非常简单,薄而且有用。

首先,您可以使用所需的任何功能定义接口:

<?php
interface DAOInterface {
    public function insert($object);
    public function remove($object);
    public function create($object);
}

然后创建它的具体实现。该实施方案可与依赖性注射(DI)轻松交换。您现在可以使用多种不同的方式存储数据。您将始终使用界面+ DI。

一个界面 - &gt;多个不同的实现/ stroing数据的方式。通常一个DAO =一个数据库对象/表。

答案 4 :(得分:1)

这可以使用Data Mapper模式完成;它封装了从持久存储中获取,更新,插入和删除域对象的逻辑。

首先,介绍将要使用的界面。

interface UserMapperInterface
{
    public function get($id);

    public function update(User $user);

    public function insert(User $user);

    public function remove(User $user);
}

然后,您创建一个实现接口的数据库特定类:

class PDOUserMapper implements UserMapperInterface
{
    private $dbh;

    public function __construct(PDO $dbh)
    {
        $this->dbh = $dbh;
    }

    public function get($id)
    {
        // do queries using $this->dbh
    }
}

使用任何映射器的代码应该键入提示接口而不是具体类,例如:

function fetchUser(UserMapperInterface $mapper, $id)
{
    return $mapper->get($id);
}

因为您的代码只适用于界面,所以您可以轻松地更换具体类。