2013-05-19 47 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; 
    } 
}