更新: 09/02/2009 - 修订后的问题,提供了更好的示例,增加了赏金。封装通用逻辑(域驱动设计,最佳实践)
嗨,
我建设使用的数据库和实体(域对象)之间的数据映射器模式的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());
同样的,琐碎的,但这个例子被简化。代码的重复仍然适用。
在我的脑海里是有意义的有某种中央对象的,可以照顾:
- 检索网站(或网站)和所有nessessary相关实体
- 创建新的新网站的实体相关实体
- 以一个网站(或网站)并保存它和所有相关实体(如果他们已经改变)
所以,回到我的问题,我应该为此对象?
- 现有的mapper对象?
- 东西基于存储库模式?*
- 基于东西彭定康工作的单位吗?*
- 别的东西吗?
*我不完全理解其中任意一个,因为你可能已经猜到了。
有没有一种标准的方法来解决这个问题,有人可以提供他们如何实现它的简短描述?我不是在寻找任何人来提供一个完整的工作实现,只是理论。
感谢,
杰克
好的,这是有道理的,需要阅读服务模式。但是,(我已经遇到了这个问题),存储库和映射器之间有什么区别。我的映射器已经提供了一个CRUD界面,为什么附加的仓库层位于顶层? – 2009-02-09 20:07:26
另外,您是否应该为每种类型的实体提供服务,或者只是您想要做某些事情的服务? – 2009-02-09 20:08:48