2

我最近开始阅读有关数据映射器的内容,我发现的所有文章都只演示了 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 实现似乎要快得多,并且使用的代码更少,但我可能错误地实现了数据映射器。

任何建议都会非常感谢。

4

1 回答 1

3

经过大量阅读后,我的实现似乎是错误的,因为域对象不应该知道 DAO,反之亦然。我是对还是错?

那是对的。

如果这样做是错误的,那么我认为数据映射器必须用于更多的 CRUD 操作?

DataMapper的目的是将数据从数据库映射到域对象。由于对象图通常不像关系数据库系统中的数据那样结构化,因此您需要某种映射器将关系数据从数据库获取到对象中,反之亦然。DataMappers 试图解决Impedance Mismatch的问题。

因此,如果我想了解用户有多少活跃订单,我可以执行以下操作:

$userMapper->getNumActiveOrders($userId);

那会是正确的吗?

是的,你可以这样做。但您也可以查询用户对象,例如

echo $user->getActiveOrders();

并且您的用户对象可能会具有某种延迟加载机制来获取活动订单。

如果我想在我的 $user 对象中设置该值,我将不得不执行以下操作:

$user->setNumActiveOrders($userMapper->getNumActiveOrders($userId));

不,您只需设置有效订单。数字可以从它们中得出。如果计数是您想在数据库中插入的东西,您将在 Mapper 中处理它。

与使用数据映射器相比,使用我的 DAO 实现似乎要快得多,并且使用的代码更少,但我可能错误地实现了数据映射器。

这很正常,因为 DAO 只查询数据库而不做任何映射。

于 2013-01-02T11:04:11.400 回答