【发布时间】:2015-08-04 15:32:57
【问题描述】:
以 DDD 方式将 EventDispatcher 注入实体是否正确?
假设我有一个名为 Card 的 DomainModel。这张通用语言的卡可以激活和停用。但是激活和停用涉及调用它在现实世界中激活的第三方 API。
所以为了保持我们的领域模型清晰,我的方法是我的 Card 实体有一个如下所示的激活方法:
public function activate()
{
$this->active = true;
$this->dispatcher->dispatch(CardEvents::CARD_ACTIVATION, new CardActivation($this));
}
然后服务正在侦听调度程序以使用外部 API 激活或不激活。
将这个 EventDispatcher 注入到实体中是否正确?
如果调用api失败怎么办?
有没有感觉监听服务最终改变了 Card 本身的 active 属性?
谢谢。
【问题讨论】:
-
你可以依赖一个简单的同步事件分派器(没有成熟的消息机制)作为一个静态类。您可以在域实体中执行类似
DomainEvents.raise(...)的操作。由于事件将被同步处理,因此将在同一事务中处理。另一种解决方案是将ICardActivator传递给activate函数,例如card.activate(activator)。最后,您也可以只调用应用层中的服务。card.activate(); cardService.activate(card);. -
有些人还会在实体中记录事件,存储库或应用程序服务将负责发布它们。
标签: service domain-driven-design event-dispatching