更新: 09/02/2009 - 修訂後的問題,提供了更好的示例,增加了賞金。封裝通用邏輯(域驅動設計,最佳實踐)
嗨,
我建設使用的數據庫和實體(域對象)之間的數據映射器模式的PHP應用程序。我的問題是:
封裝通常執行的任務的最佳方法是什麼?
例如,一個常見任務是從站點映射器中檢索一個或多個站點實體,以及從頁面映射器中檢索它們的關聯(主頁)實體。目前,我是這樣做的:
$siteMapper = new Site_Mapper();
$site = $siteMapper->findByid(1);
$pageMapper = new Page_Mapper();
$site->addPage($pageMapper->findHome($site->getId()));
現在,這是一個相當簡單的例子,但它能夠在現實中更復雜,因爲每個網站也有一個相關聯的場所,並在頁面實際上有多個版本(雖然爲了這個任務的目的,我只對最近的一個感興趣)。
我需要在我的應用程序中的多個位置執行此操作(獲取站點和相關主頁,區域設置等),並且我不能想到封裝此任務的最佳方式/位置,以至於我不必在各處重複。理想情況下,我想有這樣的事情結束了:
$someObject = new SomeClass();
$site = $someObject->someMethod(1); // or
$sites = $someObject->someOtherMethod();
其中所得的網站實體已經有了相關的實體創建,並準備使用。
保存這些對象時發生同樣的問題。說我有一個網站的實體和相關主頁實體,他們已經都被修改,我必須做這樣的事情:
$siteMapper->save($site);
$pageMapper->save($site->getHomePage());
同樣的,瑣碎的,但這個例子被簡化。代碼的重複仍然適用。
在我的腦海裏是有意義的有某種中央對象的,可以照顧:
- 檢索網站(或網站)和所有nessessary相關實體
- 創建新的新網站的實體相關實體
- 以一個網站(或網站)並保存它和所有相關實體(如果他們已經改變)
所以,回到我的問題,我應該爲此對象?
- 現有的mapper對象?
- 東西基於存儲庫模式?*
- 基於東西彭定康工作的單位嗎?*
- 別的東西嗎?
*我不完全理解其中任意一個,因爲你可能已經猜到了。
有沒有一種標準的方法來解決這個問題,有人可以提供他們如何實現它的簡短描述?我不是在尋找任何人來提供一個完整的工作實現,只是理論。
感謝,
傑克
好的,這是有道理的,需要閱讀服務模式。但是,(我已經遇到了這個問題),存儲庫和映射器之間有什麼區別。我的映射器已經提供了一個CRUD界面,爲什麼附加的倉庫層位於頂層? – 2009-02-09 20:07:26
另外,您是否應該爲每種類型的實體提供服務,或者只是您想要做某些事情的服務? – 2009-02-09 20:08:48