oop - 封装通用逻辑(领域驱动设计、最佳实践)

标签 oop domain-driven-design theory encapsulation

更新: 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());

同样,这很简单,但是这个例子已经被简化了。重复代码仍然适用。

在我看来,有某种可以照顾的中心对象是有意义的:

  • 检索一个或多个网站以及所有必要的关联实体
  • 使用新的关联实体创建新的网站实体
  • 获取一个或多个网站并保存它以及所有关联的实体(如果已更改)

回到我的问题,这个对象应该是什么?

  • 现有的映射器对象?
  • 基于存储库模式的东西?*
  • 基于工作单元模式的东西?*
  • 还有别的事吗?

* 正如您可能猜到的那样,我完全不理解其中任何一个。

是否有解决这个问题的标准方法,有人可以提供他们如何实现它的简短描述吗?我不是在寻找任何人提供完整的工作实现,只是理论。

谢谢,
jack

最佳答案

使用存储库/服务模式,您的存储库类将为每个实体提供一个简单的 CRUD 接口(interface),然后服务类将是一个附加层,用于执行附加逻辑(例如附加实体依赖项)。然后,您的应用程序的其余部分仅使用服务。您的示例可能如下所示:

$site = $siteService->getSiteById(1); // or
$sites = $siteService->getAllSites();

然后在 SiteService 类中您将看到如下内容:

function getSiteById($id) {
  $site = $siteRepository->getSiteById($id);
  foreach ($pageRepository->getPagesBySiteId($site->id) as $page)
  {
    $site->pages[] = $page;
  }
  return $site;
}

我不太了解 PHP,所以如果语法上有问题请原谅。

关于oop - 封装通用逻辑(领域驱动设计、最佳实践),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/515608/

相关文章:

algorithm - 我从解决方案中得到不同的快速排序结果

theory - 学习 lambda 演算的先决条件

c++ - 在C++中将不同的类按层次结构放在一个容器中

python - 无法访问 HTMLParser 中的新变量

.net - 限界上下文和 EF 代码优先 - 如何将它们放在一起?

domain-driven-design - 有界上下文和聚合根

java - 名称与类名不同的构造函数

c# - 作为服务定位器的通用静态类

entity - 领域驱动设计 : How to deal with User Entities in different bounded context?

ssl - 当您在表格中输入数据时,它是加密的吗?