2012-08-08 68 views
3

在我的模型層中,我有數據映射器,域對象和「服務」(用於在模型層之外進行聯絡)。我選擇實現一個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違規。

簡而言之:如何可以將數據映射器訪問域對象工廠能夠返回域對象?

回答

4

我解決這樣的:

$user = $this->domainObjectFactory->build('user'); 
$mapper = $this->dataMapperFactory->build('userMapper'); 

$user->setName('Foobar'); 
$mapper->fetch($user); 
// mapper acquires entries that are related to user with name `"Foobar"` 
// and loads it into the domain object 

的想法是,然後從存儲中檢索數據,映射器使用域對象作爲條件的現有參數。如果您正在處理域對象列表,則可以創建一個包含集合作品的映射器,然後將條件分配給該集合。

此外,您可能會發現this answer間接與您的問題相關。

+1

如何創建一個處理集合而不違反D-R-Y的映射器? – orourkek 2012-08-08 22:19:19

+1

@orourkek,如果您認爲這可能會成爲問題,那麼您應該可以對單個項目和集合使用相同的映射器。集合將實現不同的接口,只需檢查此接口。雖然我會小心這一點。根據我的經驗,集合的映射類似於僅在概念層面映射不同實體。當你開始編寫代碼時,結果會非常不同。 – 2012-08-09 00:07:38

相關問題