【发布时间】:2009-10-19 16:26:45
【问题描述】:
我们当前的 ORM 解决方案使用数据映射器来表示数据库中的表/视图,然后返回一个 Collection 对象,该对象可用于将检索到的记录作为模型对象进行迭代。在数据映射器和模型层之间是一个存储库层,它处理对数据映射器的域请求并返回相应的集合或域对象。
我们目前正在考虑重构 Repository 和 Data Mapper 层的职责,以便所有应用程序对 Data Mapper 层的请求都通过 Repository 路由,Data Mapper 将检索到的数据行返回到 Repository,然后返回必要的集合到请求对象。
我想知道的是,将整个 Repository 对象传递到相应的 Data Mapper 是否是有效/良好的做法,以便我们只能通过 Repository 层强制访问 Data Mapper。
作为一个例子,这基本上是它现在的工作方式:
class DataMapper {
public function findAll(Criteria $criteria)
{
$select = $criteria->getSelect();
// Build specific select statement
$rows = $this->_fetchAll($select);
return new Collection(array('data' => $rows, 'mapper' => get_class($this)));
}
}
我想做这样的事情:
class Repository {
public function findAllByName(Model $model)
{
$this->_criteria->addCondition('name LIKE ?', $model->name);
$rows = $this->_mapper->findAll($this);
return new Collection(array('data' => $rows, 'repository' => get_class($this)));
}
}
class DataMapper {
public function findAll(Repository $repository)
{
$select = $repository->getCriteria()->getSelect();
// Build specific select statement
$rows = $this->_fetchAll($select);
return $rows;
}
}
然后在这个版本中,Collection 对象将发出对 Repository 的调用,它可以首先搜索其缓存的对象,然后仅在需要时才向数据库发出调用以加载记录。
【问题讨论】: