1

首先,很抱歉我无法为您提供太多细节,我的问题可能听起来很笼统。

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

我对如何实现我的模型没有任何线索,以便我可以切换数据源而无需对应用程序进行重大更改。

是否有设计模式或任何设计实践可以用来处理这种情况?

我打算使用 Zend 框架。

提前感谢您的帮助。

4

5 回答 5

1

Use an interface that declares methods like GetModel1 and GetModel2 etc. Make an implementation of that interface that gets it from the database. If you switch to service methods you can write a new implementation for that interface.

By doing this you won't have to rewrite any of the other code, because from the outside looking in, GetModel1 with the database implementation will work the same as GetModel1 in the services version, in that you make a call, some magic happens on the other side of the interface, and you get a Model1 in return.

If at some point you need to switch implementations during runtime (say, get from DB when offline, but get from service if available) you can create something similar to a design pattern called dependency injection.

于 2013-07-31T15:50:56.103 回答
1

这可以使用数据映射器模式来完成;它封装了从持久存储中获取、更新、插入和删除域对象的逻辑。

首先,您介绍将使用的接口。

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);
}

因为您的代码仅适用于接口,您可以轻松地换出具体的类。

于 2013-08-01T10:14:04.550 回答
1

这实际上取决于您的应用程序体系结构的具体细节,但我会给您一个示例,说明通常的工作原理。

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

例如:

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

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

稍微想一想,您可以通过在配置文件中指定数据源来了解如何使这个更有趣。然后使用编程逻辑来确定您使用哪个数据源。

于 2013-07-31T15:51:56.880 回答
1

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

数据访问对象用于:

  1. 抽象出持久性机制
  2. 充当应用程序模型和持久性(数据库、文件系统)之间的中介
  3. 对应用程序的其余部分隐藏数据存储的所有细节
  4. 允许对持久性机制的更改不影响应用程序的其余部分

在不了解项目的太多细节的情况下,我建议实现一个数据访问接口,然后根据持久性的类型使用不同的数据访问对象实现该接口。

于 2013-07-31T15:52:40.523 回答
1

看一下DAO(数据访问对象)。最初它存在于 j2ee 世界中,但非常简单、轻薄且有用。

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

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

然后创建它的具体实现。这个实现很容易与依赖注入 (DI) 交换。您现在可以有几种不同的方式来存储您的数据。您将始终使用接口 + DI。

一个接口 -> 多种不同的实现/数据排序方式。通常一个 DAO = 一个数据库对象/表。

于 2013-07-31T15:55:30.343 回答