@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);
            }
        }
    }
}
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 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()
        ));
    }
}


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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 12:23
2500 руб./за проект
25 апр. 2024, в 12:21
10000 руб./за проект