Всем привет, изучаю ddd и возник такой вопрос по ивентам.

Допустим есть 2 контекста: user, role (Контексты здесь только для примера они не имеют значения). Создаем пользователя и создается событие UserWasCreated выбрасываем это событие где нибудь в очередь. Далее в другом контексте role слушаем событие UserWasCreated из контекста user и добавляем роль к этому пользователю. И выходит что контекст role имеет прямую зависимость из контекста user. Разве так это должно быть? Другим решением вижу принимать в аргументах не само событие а только интерфейс, но тогда придется для каждого обработчика руками дописывать какое событие он обрабатывает где нибудь в конфигурации.

11 ответов

10 просмотров

роль и пользовтаель у тебя в разных областях? и не могут иметь прямой зависимости?

Web-Dev Автор вопроса
𝔏𝔦𝔩𝔦𝔱𝔥
роль и пользовтаель у тебя в разных областях? и н...

Я же написал: контексты не играют роли, первое что придумал, вопрос именно о событиях

Web Dev
Я же написал: контексты не играют роли, первое что...

ну вообще плохо, что у тебя в данном примере роль имеет зависимость от пользователя, такого быть не должно

событие это часть контракта, на него можно ссылаться, оборачивать интерфейсом не нужно

Что подразумевается под контекстом? - bounded context ?

Я правильно понимаю, что имеется ввиду зависимость от класса события? То есть в шину вы кладете класс события, а не его сериализованные, например, в json данные?

Web-Dev Автор вопроса
Julia Nikolaeva
Я правильно понимаю, что имеется ввиду зависимость...

Да, я думал о том что если данные отправлять в json то как тогда другой контекст поймет что это за событие произошло?

Лучше рассмотреть события без привязки к ddd. Цель событий - убрать связанность между компонентами. Например есть интернет магазин. Есть сервис в котором реализована логика создания заказа - после создания заказ находится в статусе - "обрабатывается". Создание нового заказа должно инициировать оповещение клиента по почте, запрос на резерв товара у конкретного поставщика, информирование смежной системы отвечающей за сбор данных о пользователях (информация для маркетинга ) и т.д. Ключевое слово здесь - "и .т.д" - т.е. компонентов которые реагируют на создание заказа может быть переменное количество. Вариант дергать каждый компонент из сервиса заказов - трудоемкое решение - появится новый компонент который должен реагировать на создание заказа - и нужно вносить правки в сервис заказов. Альтернатива - бросать событие. Сервис/компонент который бросает событие - не знает кто его будет обрабатывать. Сервисы которые реагируют на событие - знают о событие, но не имеют связи с компонентом который его бросил. Они знают о имени события и знают как на него подписаться. Т.е. обработчик знает как минимум имя события, а сообщение с информацией о событие содержит всю необходимую информацию для его обработки. При этом лучше думать о будущем и понимать что со временем тот кто бросает событие и тот кто его обрабатывает - могут оказаться не в рамках одного приложения, а разнесенными по разным микросервисам. Поэтому имена событий завязывать на классы - очень спорное решение, так как через год-два - может получить ситуацию что событие бросает сервис на php, а обрабатывает сервис на nodejs Нужно продумать и зафиксировать протокол описывающий сообщения которые бросаются событием. Данные сообщения события могут включать: имя события, версию протокола описывающего сообщения для этого события, уникальный идентификатор события (uuid - по нему удобно отслеживать и логировать обработку события), идентификатор системы отправившей событие, а дальше уже непосредсвенно данные самого события - например информация о созданном заказе.

> сообщение с информацией о событие содержит всю необходимую информацию для его обработки. Опасный момент - это может быть экспоуз стейта. Ну то есть если ты шаришь данные через ивент - ты всё равно их шаришь, лучше про это всегда помнить мне кажется этот момент важнее, чем завязывание типа сообщения на класс

knopkod4v
> сообщение с информацией о событие содержит всю н...

если для обработки события нужна информация о состояние системы которая событие породила , то как технически можно избежать раскрытие состояния ?

Andrey Malofeykin
если для обработки события нужна информация о сост...

возможно информация была записана не туда. Это же отделение данных от поведения. Если в А кидаешь событие, в Б слушаешь и нужна инфа из А, то почему у тебя инфа в А, а не в Б? На вот этот вопрос есть смысл пытаться ответить

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

Обсуждают сегодня

Подскажите, а есть vault lite или ченить такое?) А то нужен вольт для похода в вольт, но весит он ~500 мб) как-то многовато для парочки запросов ))
Alexandr Orloff
17
Всем привет, есть небольшая проблема Есть такой скрипт document.addEventListener('DOMContentLoaded', function () { const sliderTabs = document.querySelectorAll('.s...
A da
8
@go1337 @dblackCat Привет. Все ещё дрочусь с fastpanel. Добавил второй домен который должен смотреть в рут того же сайта, но так как это просто домен, а не сайт, я не могу ему...
Ross 🦴
9
До речі, в ево нема можливості чи якого розширення щоб з адмінки з телефона зайти і терміново щось в верстці поправити?
Женя
7
кто-нибудь пользуется тайм-трекерами во время работы? так много разных нагуглил, может есть что-то популярное
Lencore
8
Пацаны. Я разрабатываю софт для инвайтинга на телетон, и столкнулся с такой проблемой, в один из чатов не могу приглашать никого, не дает добавлять, в то же время через официа...
Kernel Panic
11
Скажите, а кому нужен Currency как отдельный плагин вместо полноценного ecommerce в OctoberCMS? Кто-то использует его уже или планирует в будущем? Может я что-то не понимаю?
Igor
13
Розмовами про Рево мені нагадали часи, коли шаблони правилися прямо в адмінці. Хто в курсі, чому відійшли від цієї практики, так блейд не працює? Доволі зручно ж було (інколи)
Женя
3
Всем добрый вечер, Рад оказаться в кругу единомышленников. Начинаю погружаться в мир .net веба. Зовут Ерасыл 🖖 У меня назрел вопрос: Какой процент проектов, прошедшие через в...
Ерасыл
6
Чому? Да тому що без GiT не уявляю нормального проекта а коли код в базі то то так собі
Dmytro Lukianenko
3
Карта сайта