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