2013-05-19 27 views
1

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

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

回答

0

我会用Data Mapper的方法去。 映射器不限于数据库,它可以处理任何数据源(文件,数据库,XML,API等)

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

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