2010-11-19 53 views
2

我想弄清楚如何在應用程序的不同部分重用域模型,我有一種感覺,即數據映射器模式是前進的方向。下面的例子有直接訪問Mapper方法的方法。需要多個數據映射器的域對象

class Groups 
{ 
    protected $_groups = array(); 

    public function addGroup($name) 
    { 
     $this->_groups[] = $name; 
    } 

    public function doSomethingGroupy($cakes) 
    { 
     // get all the groups that have cake 
     return $cakeyGroups; 
    } 
} 

...還有一個映射器,用於匹配Groups類中的方法。

class GroupMapper 
{ 
    public function find($id, Groups $group) 
    { 
     // Mappy type things, maybe some sql 
    } 

    public function fetchByNeediness($cuddles, Groups $group) 
    { 
     // More mappy type things 
    } 

    public function save(Groups $groups) 
    { 
     // Saves 
    } 
} 

不過,如果晚些時候我想用同族模型,但使用不同的查詢填充組我會用不同的映射。

class AngryGroupMapper 
{ 
    public function find($id, Groups $group) 
    { 
     // Something similar but with other tables and joins 
    } 

    public function fetchByRage($anger, Groups $group) 
    { 
     // Something new but only needed here 
    } 

    public function isEditable(Groups $groups) 
    { 
     // Do some querying 
     return $bool; 
    { 
} 

現在我知道目標是瘦控制器 - 高脂模型,所以我還會有一個模型映射映射器(這麼說)示範?

class FatModelRepository 
{ 
    public function getHappyGroups() 
    { 
     $mapper = new GroupMapper(); 
     return $mapper->fetchByNeediness('Puffy Shoes', new Groups()); 
    } 

    public function getSadGroups() 
    { 
     $mapper = new AngryGroupMapper(); 
     return $mapper->fetchByRage('Aghh!', new Groups()); 
    { 

    public function save(Groups $groups) 
    { 
     $mapper = new GroupMapper(); 
     return $mapper->save($groups); 
    { 
} 

回答

4

數據模型應該不知道數據映射器。你的組類/模型不應該有查找方法,它不應該有訪問映射器。

一旦從模型中刪除了映射器依賴項,您的問題就會消失。

注:退房Doctrine 2

+0

如果「組」是包含「組」對象的集合,那些模型本身需要依賴映射,該怎麼辦?你是否需要將它們從組中分離出來,通過Mapper傳遞給它們,然後將它們重新附加到集合中?這是否意味着客戶/控制者需要Mappers的知識? – gawpertron 2010-11-19 20:20:31

+0

您的'FatModel'被稱爲存儲庫。這裏有一個很好的解釋:http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca 2010-11-19 23:08:07

+0

你爲什麼?設計它以滿足您的需求。我不會使用回購作爲緩存。將緩存放在數據映射器上。 – rojoca 2010-11-21 05:59:23

0

由於rojoca說,你不應該有獲取/直接找上了模型的方法。技術上他對模型沒有存儲對映射器的引用也是正確的,但在較不復雜的情況下,我認爲這是可以的,只要模型只會激發你計劃的最抽象的映射器形式(即某種基本映射器類或接口)。

考慮到事情,你應該只需要添加方法到映射器,爲此我只會使用繼承,即。擴展您的組映射器以獲得新功能。當然,這需要映射器可注入到模型中。但是如果你打算讓模型持有對其映射器的引用,那麼它確實需要可注入。

+0

在我第一次嘗試時,我添加了對映射器的引用,並很早就意識到了這樣做的侷限性。然而,我無法完全想象如何在沒有模型或控制器的地方使用映射器來識別它們? – gawpertron 2010-11-19 20:48:02

+0

我不敢想你的控制器直接使用映射器有什麼問題,因爲控制器是特定於應用程序/模塊的。 – prodigitalson 2010-11-19 22:44:54

+0

Mapper能否瞭解其他Mapper? – gawpertron 2010-11-30 19:51:57

相關問題