是否可以从域服务中刷新EntityManager ?



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

class OrderService
{
    // ...
    public function saveOrder(Order $order)
    {
        $this->orderRepository->add($order);
        // $this->entityManager->flush();
        $this->notificationService->notifyOrderPlaced($order);
    }
}

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

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

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

  • 域服务依赖于EntityManager的缺点是什么?
  • 有更好的选择吗?

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

您可能需要考虑以下选项之一(或两者都有)

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

    如果你担心在用例中涉及到数据库,也许你可以找到一个相当于NHibernate的Guid。梳子策略,使您的ORM生成一个Id,而无需立即向数据库发出INSERT。

  • 使用域事件。在创造之初,一个教团可以告知世界它已经被更新了。通知服务将处理事件并发送适当的通知。您将在这里找到一个示例(它还包括一个用于处理业务事务的应用层服务)。

相关内容

  • 没有找到相关文章

最新更新