我想弄清楚如何在应用程序的不同部分重用域模型,我有一种感觉,即数据映射器模式是前进的方向。下面的例子有直接访问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