数据映射器仅适用于CRUD操作?
我最近开始阅读关于数据映射器的知识,而我发现的所有文章只是演示如下的CRUD操作:
$user = new User('John', 'Joe', 'john@hotmail.com');
$userMapper->insert($user);
// or this...
$user = $userMapper->fetchById(239);
他们当然应该做更多?
目前在我的应用程序中,我使用DAO(或类似的东西),例如当我需要一个$user
对象时,我的一个工厂创建一个$userDAO
对象并将其注入到我的$user
对象中。 并从我的$user
对象做一个查询我只是做:
$this->userDAO->getNumActiveOrders($this->userId);
它会在$userDAO
对象中执行查询并返回结果。
大量阅读后,似乎我的实现是错误的,因为域对象应该不知道DAO,反之亦然。 我是对还是错?
如果这样做是错误的,那么我认为数据映射器必须用于CRUD操作以外的其他操作?
所以,如果我想知道用户有多少个活动订单,我可以这样做:
$userMapper->getNumActiveOrders($userId);
这是正确的吗?
如果我想在我的$user
对象中设置这个值,我将不得不这样做:
$user->setNumActiveOrders($userMapper->getNumActiveOrders($userId));
使用我的DAO实现似乎比使用数据映射器快得多,代码少,但我可能错误地实现了数据映射器。
任何建议将非常感谢。
大量阅读后,似乎我的实现是错误的,因为域对象应该不知道DAO,反之亦然。 我是对还是错?
那是对的。
如果这样做是错误的,那么我认为数据映射器必须用于CRUD操作以外的其他操作?
DataMapper的目的是将数据从数据库映射到域对象。 由于对象图通常不像关系数据库系统中的数据那样结构化,因此需要某种映射器来将数据库中的关系数据转换为对象,反之亦然。 DataMappers尝试解决阻抗不匹配的问题。
所以,如果我想知道用户有多少个活动订单,我可以这样做:
$userMapper->getNumActiveOrders($userId);
这是正确的吗?
是的,你可以这样做。 但你也可以查询它的用户对象,例如
echo $user->getActiveOrders();
而你的用户对象可能会有某种延迟加载机制来获取活动订单。
如果我想在我的$ user对象中设置这个值,我将不得不这样做:
$user->setNumActiveOrders($userMapper->getNumActiveOrders($userId));
不,你只需设置活动订单。 这个数字可以从它们派生出来。 如果计数是你想要插入数据库的东西,你可以在Mapper中处理。
使用我的DAO实现似乎比使用数据映射器快得多,代码少,但我可能错误地实现了数据映射器。
这很正常,因为DAO只查询数据库并且不执行任何映射。
链接地址: http://www.djcxy.com/p/9617.html上一篇: Data Mapper, only for CRUD operations?
下一篇: Implementing Domain Model and Data Mapper pattern with external data sources