@oop_ru

Страница 504 из 785
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
я не знаю, какая идеальная, знаю только хреновые)

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

Sergey
15.02.2018
18:34:45
ну мы говорим про “идеальную"
order.cancel() events = order.releaseEvents() dispatcher.dispatch(...events);

то есть в процессе своей жизни "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
скажем оредр внутри вызвал catalog.incrementProductCount(this)
нет, ордер не имеет доступа к какталогу

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
ну мы в итоге пришли к CatalogManager.onOrderCanceled
и чем это лучше чем CatalogManager.CancelOrder ?

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
причем "каталог" вполне может быть сервисом

у меня в целом вся (абсолютно) логика в сервисах лежит. Оно как-то с божьей помощью дёргается событиями/командами и ок
ой и ты хочешь сказать что у тебя там сущности анемичные?) геттеры и сеттеры на ES?)

абсолютно все управление процессом может быть?

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
можно даже без ивентов это делать

но, да, сами сущности вполне себе анемичные. на этих словах где-то в бегах залетает Анетон)
хз, это надо разбираться в твоей предметной области и смотреть код что бы судить о том херня или нет

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
Паттерн матчинг скаловский

Google
Serge
15.02.2018
19:35:39
а внешние штуки, которые уже знают когда "что делали" превращается в факты (закоммитилась успешно транзакция в базе) достают пачку ивентов и уже прокидывают на обработку
а вот, кстати, если синхронные ивенты считаются неотъемлемой частью бизнес-транзакции и, как следствие, транзакции БД, то кто должен рулить транзакцией? Команда?

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.

Страница 504 из 785