【发布时间】:2009-02-05 11:59:59
【问题描述】:
更新日期: 2009 年 9 月 2 日 - 修改问题,提供更好的示例,增加赏金。
嗨,
我正在使用数据库和实体(域对象)之间的数据映射器模式构建一个 PHP 应用程序。我的问题是:
封装一个常用任务的最佳方式是什么?
例如,一项常见任务是从站点映射器中检索一个或多个站点实体,并从页面映射器中检索它们关联的(主页)页面实体。目前,我会这样做:
$siteMapper = new Site_Mapper();
$site = $siteMapper->findByid(1);
$pageMapper = new Page_Mapper();
$site->addPage($pageMapper->findHome($site->getId()));
现在这是一个相当微不足道的例子,但实际上它变得更加复杂,因为每个站点也有一个关联的语言环境,并且页面实际上有多个修订版(尽管出于本任务的目的,我只对最近的)。
我需要在我的应用程序中的多个位置执行此操作(获取站点和关联的主页、区域设置等),我想不出封装此任务的最佳方式/位置,所以我不必到处重复。理想情况下,我希望得到这样的结果:
$someObject = new SomeClass();
$site = $someObject->someMethod(1); // or
$sites = $someObject->someOtherMethod();
生成的站点实体已经创建了关联实体并可供使用。
保存这些对象时也会出现同样的问题。假设我有一个站点实体和关联的主页实体,并且它们都已被修改,我必须这样做:
$siteMapper->save($site);
$pageMapper->save($site->getHomePage());
同样,微不足道,但此示例已简化。重复代码仍然适用。
在我看来,拥有某种可以处理的中心对象是有意义的:
- 检索一个(或多个)站点和所有必要的关联实体
- 使用新的关联实体创建新的站点实体
- 获取一个(或多个)站点并保存它和所有关联实体(如果它们已更改)
那么回到我的问题,这个对象应该是什么?
- 现有的映射器对象?
- 基于存储库模式的东西?*
- 基于工作单元模式的东西?*
- 还有别的吗?
* 我不完全理解其中任何一个,你可能猜到了。
是否有解决此问题的标准方法,有人可以简要说明他们将如何实现它吗?我不是在寻找任何人来提供一个完全有效的实现,只是理论。
谢谢,
杰克
【问题讨论】:
标签: oop domain-driven-design theory encapsulation