1

我有一个名为 的域服务OrderService,它有一个saveOrder()方法:

class OrderService
{
    // ...

    public function saveOrder(Order $order)
    {
        $this->orderRepository->add($order);
        // $this->entityManager->flush();

        $this->notificationService->notifyOrderPlaced($order);
    }
}

saveOrder()将订单添加到存储库(内部调用persist()EntityManager),然后将订单传递给 NotificationService 以发送适当的通知(电子邮件、短信)。

问题是,虽然 NotificationService 需要将订单 ID 包含在通知中,但订单还没有 ID,因为它没有被持久化到数据库(ID 是自动生成的)。

显而易见的解决方案似乎是将 EntityManager 作为依赖项传递给 OrderService,并flush()在存储库add()方法之后,如上面的示例所示。但我一直不愿意让域服务知道 EntityManager,宁愿让它们只与存储库或其他服务对话。

  • 依赖 EntityManager 的域服务有哪些缺点(如果有的话)?
  • 有更好的选择吗?

注意:我使用的是 PHP 和 Doctrine ORM,但我相信同样的原则也适用于 Java 和 Hibernate。

4

1 回答 1

0

您可能需要考虑这些选项之一(或两者)

  • 使该服务成为应用层服务而不是域服务。在应用程序服务中调用更改跟踪器是完全可以的,因为它应该知道当前用例中的应用程序上下文和进度。典型的应用程序服务将提交业务事务/要求更改跟踪器在完成后保存更改,那么为什么不调用它来生成 Id呢?

    如果您担心在用例中间涉及数据库,也许您可​​以找到与 NHibernate 的Guid.Comb 策略等效的策略,以使您的 ORM 生成 Id 而无需立即向数据库发出 INSERT。

  • 使用域事件。在创建后,Order 可以通知世界它已被更新。通知服务将处理该事件并发送适当的通知。您将在此处找到一个示例(它还包括一个应用程序层服务来处理业务事务)。

于 2013-04-02T15:26:23.367 回答