在我的模型層中,我有數據映射器,域對象和「服務」(用於在模型層之外進行聯絡)。我選擇實現一個DomainObjectFactory和一個DataMapperFactory,這讓我停留在DM關係上。理想情況下,數據映射器將爲每個執行「獲取」/「讀取」的方法返回相關域對象的實例(或實例數組),但數據映射器無權訪問域對象工廠。數據映射器應該如何返回一個域對象?
沒有DM和DO的工廠模式,自動裝載機可以在DM內接管,從而可以創建DO的實例。但是,這對於工廠來說如何完成呢?
一個可能的解決方案,我能想到的將是相關域對象的實例傳遞給數據映射器的方法,如:
$user = $this->domainObjectFactory->build('user');
$mapper = $this->dataMapperFactory->build('userMapper');
//Pass an [empty] user DO to the DM, which will be returned back
$mapper->getById($someIDValue, $user);
此選項看起來很乾淨,但它會工作單GET方法。然而,在處理返回一個域對象數組時,它在語義上是脫離軌道的,所以顯然這不是實現這個目標的最好方法......另一種選擇是允許數據映射器訪問域對象工廠,但這會變成大規模的LOD/SRP違規。
簡而言之:如何可以將數據映射器訪問域對象工廠能夠返回域對象?
如何創建一個處理集合而不違反D-R-Y的映射器? – orourkek 2012-08-08 22:19:19
@orourkek,如果您認爲這可能會成爲問題,那麼您應該可以對單個項目和集合使用相同的映射器。集合將實現不同的接口,只需檢查此接口。雖然我會小心這一點。根據我的經驗,集合的映射類似於僅在概念層面映射不同實體。當你開始編寫代碼時,結果會非常不同。 – 2012-08-09 00:07:38