3

在我的模型层中,我有数据映射器、域对象和“服务”(位于模型层之外)。我选择实现 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);

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

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

4

1 回答 1

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

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

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

于 2012-08-08T22:08:15.777 回答