首先,我很抱歉,我无法向您提供更多详细信息,而且我的问题可能听起来很普遍。
我正在开展一个小项目,但项目的要求有点紧张。我必须使数据源可切换。因此,如果我现在将数据库用作数据源,它可能能够使用Web服务或文件。
我对如何实现我的模型没有任何线索,这样我就可以在不对应用程序进行重大更改的情况下切换数据源。
我可以使用设计模式或设计实践来处理这种情况吗?
我打算使用Zend Framework。
提前感谢您的帮助。
答案 0 :(得分:1)
使用一个声明GetModel1和GetModel2等方法的接口。创建一个从数据库中获取它的接口的实现。如果切换到服务方法,则可以为该接口编写新的实现。
通过执行此操作,您不必重写任何其他代码,因为从外部查看,具有数据库实现的GetModel1将与服务版本中的GetModel1相同,因为您可以进行调用,魔法发生在界面的另一端,你得到一个Model1作为回报。
如果在某些时候你需要在运行时切换实现(比如,离线时从数据库获取,但是从服务获得,如果可用),你可以创建类似于称为依赖注入的设计模式的东西。
答案 1 :(得分:1)
这实际上取决于你的应用程序架构,但我会给你一个通常有效的例子。
您希望将数据库调用与其余代码分离为单独的文件/类。
例如:
Person class:
getPerson -> calls PersonConnectionClass::queryForPerson($x);
在最基本的形式中,您只需在切换数据库引擎或其他数据源(即xml,平面文件等)时替换PersonConnectionClass。
只要稍微考虑一下,您就可以通过在配置文件中指定数据源来了解如何使这个更有魅力。然后使用编程逻辑确定您使用的数据源。
答案 2 :(得分:1)
我不熟悉Zen框架,但您正在寻找的设计模式是Data Access Object和Data Transfer Objects。
数据访问对象用于:
在不了解项目的太多细节的情况下,我建议实现数据访问接口,然后根据持久性的类型实现具有不同数据访问对象的接口。
答案 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);
}
因为您的代码只适用于界面,所以您可以轻松地更换具体类。