gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:10:00 25 4
gpt4 key购买 nike

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

同样,微不足道,但这个例子被简化了。重复代码仍然适用。

在我看来,拥有某种可以处理的中心对象是有意义的:
  • 检索一个(或多个)站点和所有必要的关联实体
  • 创建具有新关联实体的新站点实体
  • 获取一个(或多个)站点并保存它和所有相关实体(如果它们已更改)

  • 所以回到我的问题,这个对象应该是什么?
  • 现有的映射器对象?
  • 基于存储库模式的东西?*
  • 基于工作模式的东西?*
  • 还有什么?

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

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

    谢谢,
    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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com