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

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

11 ответов

16 просмотров

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Привет!) Кто как юзает переменные в строках?) Чисто ради интереса Вот так: echo "У меня {$bananasAmount} бананов"; Или вот так: echo "У меня ${bananasAmount} бананов";
Виталий
3
разработчик ботов скидывает портфолио, боты которые он уже создал. А вот как узнать что это именно он их создал?
Gosudar
4
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта