2013-07-31 64 views
1

首先,我很抱歉,我無法爲您提供更多細節,而且我的問題聽起來可能一般。與數據源的鬆耦合

我正在做一個小項目,但項目的要求是有點線。我必須使數據源可切換。因此,如果將來我現在將數據庫用作數據源,它可能會使用Web服務或文件。

我對如何實現我的模型沒有任何線索,因此我可以在不對應用程序進行重大更改的情況下切換數據源。

有沒有可用於處理這種情況的設計模式或任何設計實踐?

我打算使用Zend Framework。

感謝您的幫助提前。

回答

1

看看DAO s(數據訪問對象)。最初它存在於j2ee世界,但非常簡單,簡單且有用。

首先定義你所需要的任何功能的接口:

<?php 
interface DAOInterface { 
    public function insert($object); 
    public function remove($object); 
    public function create($object); 
} 

然後創建一個具體實施它。這個實現很容易與依賴注入(DI)交換。您現在可以有幾種不同的存儲數據的方式。您將始終使用界面+ DI。

一個接口 - >多個不同的實現/ stroing數據的方式。通常一個DAO =一個數據庫對象/表。

1

使用聲明如GetModel1和GetModel2等方法的接口。製作從數據庫獲取它的接口的實現。如果切換到服務方法,您可以爲該接口編寫一個新的實現。

通過這樣做,您不必重寫任何其他代碼,因爲從外部查看,具有數據庫實現的GetModel1將與服務版本中的GetModel1一樣工作,因爲您撥打電話,在界面的另一側會發生一些魔法,並返回一個Model1。

如果你在某些時候需要在運行時轉換實現(比如,從DB時下線,但是從服務中獲得如果可用),您可以創建一個類似稱爲依賴注入設計模式的東西。

1

這真的取決於你的應用架構上的這個細節,但我會給你一個什麼樣通常工作的例子。

您希望將數據庫調用從其餘代碼中分離出單獨的文件/類。

例如:

Person class: 
getPerson -> calls PersonConnectionClass::queryForPerson($x); 

在最基本的形式中,只需換出PersonConnectionClass當切換數據庫引擎或其他數據源(即XML,平面文件,等)。

想一想,你可以通過在一個配置文件中指定你的數據源來看看如何讓這個愛好者。然後使用編程邏輯來確定您使用的數據源。

1

我對Zen框架並不熟悉,但您正在尋找的設計模式是Data Access ObjectData Transfer Objects

數據訪問對象用於:

  1. 抽象掉持久性機制
  2. 充當應用模型和持久性之間的中介(數據庫,文件系統)
  3. 隱藏數據的所有細節從應用程序的其餘部分存儲
  4. 允許更改持久性機制而不影響應用程序的其餘部分

不知道你項目的太多細節,我會建議實現一個數據訪問接口,然後根據持久性的類型使用不同的數據訪問對象來實現這個接口。

1

這可以使用數據映射器模式完成;它封裝了從永久存儲中獲取,更新,插入和刪除域對象的邏輯。

首先,介紹將要使用的接口。

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

因爲你的代碼只適用於接口,所以你可以很容易地換出具體的類。