
Bohdan
15.02.2018
18:32:14
ивенты?

Ihor
15.02.2018
18:32:15
и может управлять ProductStore( Catalag, ну или любое другое название)

Bohdan
15.02.2018
18:32:21
продукты он может менять сам по идее

Ihor
15.02.2018
18:32:28
то есть внутри будет EventDispatcher?

Google

Bohdan
15.02.2018
18:32:32
если их кол-во относится к продукту
зависит от реализации

Ihor
15.02.2018
18:33:03
ну мы говорим про “идеальную"

Dmitriy
15.02.2018
18:33:15
доменные ивенты?

Bohdan
15.02.2018
18:33:18
я не знаю, какая идеальная, знаю только хреновые)

Sergey
15.02.2018
18:33:36

Ihor
15.02.2018
18:34:41
доменные евенты? можно поподробней?

Sergey
15.02.2018
18:34:45
то есть в процессе своей жизни "order" запоминает что с ней происходило

Ihor
15.02.2018
18:35:40
хм

Sergey
15.02.2018
18:35:55
а внешние штуки, которые уже знают когда "что делали" превращается в факты (закоммитилась успешно транзакция в базе) достают пачку ивентов и уже прокидывают на обработку

Google

Ihor
15.02.2018
18:35:59
скажем оредр внутри вызвал catalog.incrementProductCount(this)

Sergey
15.02.2018
18:36:11

Ihor
15.02.2018
18:36:13
ну то есть создал ивент не усебя

Sergey
15.02.2018
18:36:25

Ihor
15.02.2018
18:36:30
ок
Catalog будет слушать ивент order_canceled?

Sergey
15.02.2018
18:37:06
да, не сам каталог а что-то над ним
некий менеджер процесса который слушает события и тригерит операции

Ihor
15.02.2018
18:37:28
что-то
?

Maksim
15.02.2018
18:38:05
сервис какой-нить, сага, или вообще фронт...)

Adel
15.02.2018
18:38:10
есть такое понятие сервисный слой

Maksim
15.02.2018
18:38:14
что именно - за кадром) что-то

Ihor
15.02.2018
18:38:16
ну мы в итоге пришли к CatalogManager.onOrderCanceled

Sergey
15.02.2018
18:38:20
ну это не совсем "сервисный слой"
да и ты наверное имел ввиду application layer

Adel
15.02.2018
18:38:42
ну для меня сервисный слой - то что обвязывает домен с инфраструктурой

Maksim
15.02.2018
18:39:07
а чем он от апликейшена отличается?

Sergey
15.02.2018
18:39:12

Ihor
15.02.2018
18:39:26

Google

Sergey
15.02.2018
18:39:29
твой CatalogManager становится безумно тупым и теперь он отвечает исключительно за координацию действий
ни одного if-а в нем быть не должно
(мы же все еще про идеальное?)

Ihor
15.02.2018
18:40:37
о да
тем где бизнес логика
если ордер закенселили, нужно сделать доступными продукты из ордера для следующего заказа

Sergey
15.02.2018
18:41:17
но если у тебя операция затрагивает несколько контекстов - у тебя полюбому должно быть что-то сверху что координирует действия

Ihor
15.02.2018
18:41:21
разве не бизнес логика?

Sergey
15.02.2018
18:42:35
разве не бизнес логика?
onOrderCanceled(event: OrderCanceled): void {
// достать айдишки продуктов
// попросить сущность каталог снять резервацию товаров
}
2-3 строчки кода получится
а вся бизнес логика где-то внутри

Maksim
15.02.2018
18:42:53
у меня в целом вся (абсолютно) логика в сервисах лежит. Оно как-то с божьей помощью дёргается событиями/командами и ок

Sergey
15.02.2018
18:42:57
причем "каталог" вполне может быть сервисом
абсолютно все управление процессом может быть?

Maksim
15.02.2018
18:43:35

Ihor
15.02.2018
18:43:57
// попросить сущность каталог снять резервацию товаров - это прям и есть бизнес логика

Sergey
15.02.2018
18:44:41

Maksim
15.02.2018
18:44:55
но, да, сами сущности вполне себе анемичные.
на этих словах где-то в бегах залетает Анетон)

Google

Sergey
15.02.2018
18:44:56
можно даже без ивентов это делать

Maksim
15.02.2018
18:45:32

Sergey
15.02.2018
18:46:12

Maksim
15.02.2018
18:46:29

Sergey
15.02.2018
18:46:50
cancelOrder()
{
order.cancel()
// если не выплюнуло исключений - следующие шаги
}
главное что бы в этих сервисах небыло логики - только описание процесса

Ihor
15.02.2018
18:47:03
да

Maksim
15.02.2018
18:47:12
скажем так, не нашёл баланса между размазываем логики между сервисами и сущностями) либо тотальном перекладывании оной в сущности, к примеру.

Admin
ERROR: S client not available

Sergey
15.02.2018
18:47:51
короч

Maksim
15.02.2018
18:48:20
ну вот я пока в поисках "идеала"

Sergey
15.02.2018
18:49:32
"координаторы" или менеджеры котоыре выполняют действия - это нормально если они тупые. Плюс тут в том что это просто и удобно. А доменные ивенты добавляют ко всему этому гибкость, поскольку у тебя процесс строится как причинно следственная связь. Однако это сложнее, и, если плохо сделать, сложнее дебажить и поддерживать.

Maksim
15.02.2018
18:50:28
по факту у меня получается так, что по сути сами сервисы - вполне себе геттеры/сеттеры так или иначе.
а логика +/- вся тусит в сагах

Enterpise
15.02.2018
19:23:56
А ну быстро напомнили каким паттерном заменить атипаттерн "swich / case "

da horsie
15.02.2018
19:24:11
полиморфизмом?

Victor
15.02.2018
19:26:13
Паттерн матчинг скаловский

Sergey
15.02.2018
19:26:40

Google

Serge
15.02.2018
19:35:39

Sergey
15.02.2018
19:36:14

Serge
15.02.2018
19:39:52
ну когда важен результат успешной их обработки для успешной фиксации транзакции. К примеру, аудит (логгирование в терминах домена), оповещения

Sergey
15.02.2018
19:41:26
у тебя сначала фиксация а уже потом ивенты. До фиксации ивенты собираются но на обработку не отправляются.

Serge
15.02.2018
19:42:09
вот не катит по требованиям бизноса

Sergey
15.02.2018
19:42:20
приведи пример бизнес транзакции
и что после ее "фиксации" надо делать

Serge
15.02.2018
19:45:41
вот оба примера привёл: аудит и оповещения других пользователей. С точки зрения основного сценария транзакции (изменение состояния сущности, добавление/изменение VO), эта логика побочная, но с точки зрения бизнеса фиксация без аудита недопустима.

Sergey
15.02.2018
19:46:29
ммм
ничего не понимаю... сохраняй ивенты в отдельную табличку - получаешь аудит

Serge
15.02.2018
19:46:56
возможно, это не есть ивенты в терминах DDD

Sergey
15.02.2018
19:47:12
domain event => факт, запись в твоем аудит логе если хочешь
их генерит только твой aggregate root
и забираешь ты их только тогда, когда уверен что изменения зафиксированы
причем персистер твоего агрегата может заперсистить и ивенты = аудит который не пропадет
а если пойти еще дальше -> получаем что сначала делаем ивент стрим и по нему уже строим проекцию агрегата
но это уже event sourcing какой-то выходит

Serge
15.02.2018
19:49:57
ES не рассматриваю на текущем проекте вообще. Тут надо Всё Менять, и в первую очередь, в головах.
вопрос, на самом деле, про transaction management какой-нибудь. Я хз где прочитать, поисковики нерелевантным плюются. Может, знает кто? А то в простейшем случае из app layer получается жёсткая привязка к persistence.

Sergey
15.02.2018
19:53:31