在我的模型层中,我有数据映射器,域对象和“服务”(用于在模型层之外进行联络)。我选择实现一个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违规。
简而言之:如何可以将数据映射器访问域对象工厂能够返回域对象?
如何创建一个处理集合而不违反D-R-Y的映射器? – orourkek 2012-08-08 22:19:19
@orourkek,如果您认为这可能会成为问题,那么您应该可以对单个项目和集合使用相同的映射器。集合将实现不同的接口,只需检查此接口。虽然我会小心这一点。根据我的经验,集合的映射类似于仅在概念层面映射不同实体。当你开始编写代码时,结果会非常不同。 – 2012-08-09 00:07:38