Задать вопрос
@AlpineMilk

Как взаимодействовать с разными контекстами через события?

Всем привет, изучаю ddd и возник такой вопрос по ивентам. Допустим есть 2 контекста: user, panel. Создаем пользователя и создается событие UserWasCreatedEvent выбрасываем это событие где нибудь в очередь. Далее в другом контексте panel слушаем событие UserWasCreatedEvent из контекста user и что-нибудь делаем. И выходит что контекст panel имеет прямую зависимость из контекста user. Разве так это должно быть? Как можно избавится от этой зависимости к другому контексту?
Примерный код:
namespace User\Domain\Event;

class UserWasCreatedEvent
{
    // event data
}

---------------------------------------------

namespace Panel\Domain\Event;

use User\Domain\Event;

class UserWasCreatedEventHandler
{
    public function __invoke(UserWasCreatedEvent $createdEvent)
    {
        // do something
    }
}

---------------------------------------------

namespace Shared\Infrastructure\EventSubscriber\Doctrine;

class DomainEventSubscriber
{
    ...

    public function publish(): void
    {
        foreach ($this->entities as $entity) {
            foreach ($entity->releaseEvents() as $event) {
                $this->eventBus->dispatch($event);
            }
        }
    }
}
  • Вопрос задан
  • 142 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Далее в другом контексте panel слушаем событие UserWasCreatedEvent из контекста user и что-нибудь делаем.


Слушать надо не в контексте panel, а, например, в контексте EventSubscriber:

namespace Shared\Infrastructure\EventSubscriber\Doctrine;

use User\Domain\Event\UserWasCreatedEvent;
use Panel\Domain\SomeHandler;
use Panel\Domain\SomeCommand;

class UserWasCreatedEventHandler
{
    private SomeHandler $handler;

    public function __construct(SomeHandler $handler)
    {
        $this->handler = $handler;
    }

    public function __invoke(UserWasCreatedEvent $createdEvent)
    {
        $this->handler->handle(new SomeCommand(
            $createdEvent->getId(),
            $createdEvent->getSomeInfo()
        ));
    }
}


Таким образом в этом месте связывается два независимых контекста. Паттерн "медиатор", если не ошибаюсь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы