1

假设我想构建一个应用程序,其中模型可以有不同的数据源(如 MySQL、一些 API、XML 等)。

为了实现这样的事情,最常见的方法是什么,以及将使用哪些设计模式?

4

2 回答 2

2

我认为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;
    }
}
于 2013-05-20T11:08:42.160 回答
0

我会使用Data Mapper方法。映射器不限于数据库,它可以处理任何数据源(文件、db、xml、api 等)

最重要的是让您的领域模型与数据源分离。使映射器真正可互换可能是一件困难的事情,因为数据源属于不同的类型。XML 源是不可写的,因此您不能实现例如插入方法。

于 2013-05-19T14:08:59.300 回答