假设我想构建一个应用程序,其中模型可以有不同的数据源(如 MySQL、一些 API、XML 等)。
为了实现这样的事情,最常见的方法是什么,以及将使用哪些设计模式?
假设我想构建一个应用程序,其中模型可以有不同的数据源(如 MySQL、一些 API、XML 等)。
为了实现这样的事情,最常见的方法是什么,以及将使用哪些设计模式?
我认为DAO是您正在寻找的。
像这样想:
interface RdbmsDriver {
public function connect();
public function disconnect();
public function query($sql);
public function fetchAll($sql);
}
class MysqliDriver implements RdbmsDriver {
public function connect() { }
public function disconnect() { }
public function query($sql) { }
public function fetchAll($sql) { }
}
class PgsqlDriver implements RdbmsDriver {
public function connect() { }
public function disconnect() { }
public function query($sql) { }
public function fetchAll($sql) { }
}
abstract class RdbmsDao {
protected $driver;
public function __construct(RdbmsDriver $driver) {
$this->driver = $driver;
}
}
interface SomeEntityDao {
public function insert(SomeEntity entity);
public function update(SomeEntity entity);
public function delete(SomeEntity entity);
public function find($entityKey);
public function findAll();
}
/**
* Data from relational databases.
*/
class SomeEntityRdbmsDao extends RdbmsDao implements SomeEntityDao {
public function insert(SomeEntity entity) { }
public function update(SomeEntity entity) { }
public function delete(SomeEntity entity) { }
public function find($entityKey) { }
public function findAll() { }
}
// Use like: new SomeEntityRdbmsDao(new MysqliDriver(...))
/**
* Data from a webservice
*/
class SomeEntityWebServiceDao implements SomeEntityDao {
public function insert(SomeEntity entity) { }
public function update(SomeEntity entity) { }
public function delete(SomeEntity entity) { }
public function find($entityKey) { }
public function findAll() { }
}
class SomeEntityModel {
private $persistance;
public function __construct(SomeEntityDao $persistance) {
$this->persistance = $persistance;
}
}
我会使用Data Mapper方法。映射器不限于数据库,它可以处理任何数据源(文件、db、xml、api 等)
最重要的是让您的领域模型与数据源分离。使映射器真正可互换可能是一件困难的事情,因为数据源属于不同的类型。XML 源是不可写的,因此您不能实现例如插入方法。