2012-08-08 52 views
3

在我的模型层中,我有数据映射器,域对象和“服务”(用于在模型层之外进行联络)。我选择实现一个DomainObjectFactory和一个DataMapperFactory,这让我停留在DM关系上。理想情况下,数据映射器将为每个执行“获取”/“读取”的方法返回相关域对象的实例(或实例数组),但数据映射器无权访问域对象工厂。数据映射器应该如何返回一个域对象?

没有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

我解决这样的:

$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间接与您的问题相关。

+1

如何创建一个处理集合而不违反D-R-Y的映射器? – orourkek 2012-08-08 22:19:19

+1

@orourkek,如果您认为这可能会成为问题,那么您应该可以对单个项目和集合使用相同的映射器。集合将实现不同的接口,只需检查此接口。虽然我会小心这一点。根据我的经验,集合的映射类似于仅在概念层面映射不同实体。当你开始编写代码时,结果会非常不同。 – 2012-08-09 00:07:38

相关问题