2012-12-27 26 views
0

我想在代碼中更好地實現OOP和依賴注入,並遇到以下問題。依賴注入與多個數據庫調用

我到僱主和公司參與(與相應型號,映射器和數據庫表)的客戶提供服務:

class Service 
{ 
    protected $clientId; 
    protected $client; 
    protected $employerId; 
    protected $employer; 
    protected $companyId; 
    protected $company; 

    public function setClient(Client $client) 
    { 
     $this->client = $client;  
    } 

    public function setEmployer(Employer $client) 
    { 
     $this->employer = $employer; 
    } 

    public function setCompany(Company $company) 
    { 
     $this->company = $company; 
    } 

    // more 
} 

要得到服務對象我首先實例,它返回一個clientId服務對象來自數據庫。通過clientId,我實例化一個Client對象(並將其附加到服務),這涉及到再次訪問數據庫。僱主和公司一樣。

我可以從數據庫中一次性檢索服務,客戶端,僱主和公司,但這會使我的映射器更加複雜。例如。客戶,僱主和公司都有地址,所以我需要將這些列別名並映射到各自的模型。這不是簡單地從每個表中檢索所有列並將它們分別映射到每個模型(例如,用一些邏輯將下劃線列轉換爲ZF camelCase),重新使用我的客戶端,僱主和公司映射器。

是否有最佳實踐解決方案,還是取決於個人喜好和環境(性能與可維護性)?

回答

1

首先,有一篇關於PHP依賴注入的文章,我認爲它是Worth Checking Out。其次,你的問題實際上並不是關於依賴注入的問題,因爲你的主要問題都是關於你應該查詢數據庫的次數。

如果你將這些對象注入到服務中,那麼將它們一次或一次地全部調用並不重要。真正的問題是「我可以多次購買數據庫」。依賴注入的一大優點是你可以很容易地改變被提供對象的來源(所以如果你有一個數據庫幫助類或類似的東西,依賴注入對於可變數據庫對象來說是很好的)。

你必須問問你自己常見的MySQL問題,收集這些信息(性能與可維護性)。實際上,如果你有一個關係表,那麼就可以用連接來查詢它,並映射出這些表。

你可以看看其他ORM如何從數據庫中提取對象,但你是最瞭解應用程序的人。可維護性SHOULDNT是一個非常值得關注的問題,因爲你可以很好地抽象出一些東西。

如果您的數據庫發生更改,您只需更改映射對象,並且如果業務邏輯發生更改,則無需觸摸DBAL。