数据映射器应该如何返回域对象?

时间:2012-08-08 21:52:40

标签: php datamapper domain-object poeaa

在我的模型层中,我有数据映射器,域对象和“服务”(在模型层之外)。我选择实现一个DomainObjectFactory和一个DataMapperFactory,这让我陷入了DM< - > DO关系。理想情况下,数据映射器将为执行“获取”/“读取”的每个方法返回相关域对象的实例(或实例数组),但数据映射器无权访问域对象工厂。

如果没有DM和DO上的工厂模式,自动装带器可以在DM内接管,从而可以创建DO的实例。但是如何通过工厂实现这一目标?

我能想到的一个可能的解决方案是将相关域对象的实例传递给数据映射器方法,例如:

    $user = $this->domainObjectFactory->build('user');
    $mapper = $this->dataMapperFactory->build('userMapper');

    //Pass an [empty] user DO to the DM, which will be returned back
    $mapper->getById($someIDValue, $user);

这个选项看起来很脏,但它适用于单个get方法。然而,在处理返回域对象数组时,它在语义上处于离线状态,因此显然这不是实现此目的的最佳方法...另一种选择是允许数据映射器访问域对象工厂,但那会变成一次大规模的LOD / SRP违规。

简而言之: 数据映射器如何访问域对象工厂才能返回域对象?

1 个答案:

答案 0 :(得分:4)

我这样解决:

$user = $this->domainObjectFactory->build('user');
$mapper = $this->dataMapperFactory->build('userMapper');

$user->setName('Foobar');
$mapper->fetch( $user );
// mapper acquires entries that are related to user with name `"Foobar"`
// and loads it into the domain object

这个想法是,然后从存储中检索数据,映射器使用域对象的现有参数作为条件。如果您正在处理域对象列表,则可以创建一个包含集合的映射器,并将条件分配给该集合。

此外,您可能会发现this answer与您的问题间接相关。