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


How should a data mapper return a domain object?

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

如果没有 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);

此选项看起来很脏,但它适用于单个获取方法。但是,在处理返回域对象数组时,它在语义上偏离了轨道,因此显然这不是实现此目的的最佳方法......另一种选择是允许数据映射器访问域对象工厂,但这将变成大规模的 LOD/SRP 冲突。

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

我是这样解决的:

$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

这个想法是,然后从存储中检索数据,映射器使用域对象的现有参数作为条件。如果要处理域对象列表,请改为创建具有处理集合的映射器,并将条件分配给该集合。

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