2

以 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 属性?

谢谢。

4

1 回答 1

1

如果 activate 方法中的这个 EventDispatcher 只是对来自域的接口的引用,那么是的,没关系。然后,您可以将此接口从您的域公开到另一层并创建一个实现该接口的类(例如在应用程序层中),并且该类可以使用第三方库或其他任何东西来实现。这样一来,您的域就不会知道IEventDispatcher接口是如何实现的,从而确保它不受更改的影响。

请记住,更改此 EventDispatcher 的实现方式(如果它使用第三方插件,或者您自己实现)不应影响您的域/业务逻辑。也许使用它的应用程序可能会受到影响。您可能有许多应用程序(Web、移动、桌面)可以停用卡片,每个应用程序都有不同的 EventDispatcher 版本/实现(或相同),这不会影响您的域。如果是这样,那么您应该检查您的设计。

此外,只有当您必须调用 EventDispatcher 时,我才会将 EventDispatcher 保留在您的 Card 模型中,而不管哪个应用程序(Web、桌面、移动、Web 服务)正在请求该activate()方法,这意味着调用某些 EventDispatcherdispatch()的方法是您的业务逻辑的一部分(注意对某个词的强调,因为域不知道它是如何实现的,它),只是因为你的域想要给应用程序一个执行调度的机会,无论它是否有效,如果它做某事或不做某事(域不关心它,它只是调用它)。

于 2015-12-02T19:46:22.253 回答