我想弄清楚如何在應用程序的不同部分重用域模型,我有一種感覺,即數據映射器模式是前進的方向。下面的例子有直接訪問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);
{
}
如果「組」是包含「組」對象的集合,那些模型本身需要依賴映射,該怎麼辦?你是否需要將它們從組中分離出來,通過Mapper傳遞給它們,然後將它們重新附加到集合中?這是否意味着客戶/控制者需要Mappers的知識? – gawpertron 2010-11-19 20:20:31
您的'FatModel'被稱爲存儲庫。這裏有一個很好的解釋:http://msdn.microsoft.com/en-us/magazine/dd569757.aspx#id0400058 – rojoca 2010-11-19 23:08:07
你爲什麼?設計它以滿足您的需求。我不會使用回購作爲緩存。將緩存放在數據映射器上。 – rojoca 2010-11-21 05:59:23