

Sergey
15.12.2017
10:01:11
Не микрсоервисы. Если на слабосвязанные бандлы например делить, которые в рамках одного приложения, я думаю тоже это можно назвать сервис ориентирвоанной архитектурой. Ну и сервисы м воспринимаем как "что то делающий деятель", то есть в процессе размышления ставим действия а не данные. Ну и пришел я к SOA vs ES потмоу что ты сказал что без событий не получается грамотный whole object. То есть еще раз, вопросполучается как с whole object создать бизнес транзакцию без событий. Т.е. например получаем фотку от юзера и если там порнуха, то отклоняем ее, заносим полььзователя в бан на месяц, и отсылаем емэй в ментовку например)
1.Анемичная модель:
Сервис фотоприемщик, в которые инджектится фотоМодератор, в который инджектятся сервисФотореагировщик, и уже реализация этого реагирвоика содержит вызов сервисов отправки емайла, бана и т.д. Заметим, если всё делать через DI это будет ее все очень расширемо и легко кастомизируемо за счет полиморфизма в релализации интерфейса разными классами под каждую ситуацию(порно фотка, недостаточный размер фотки, мат на фотке и т.д) Все понятно, хорошо читается и расширяется. Если есть к вашей ide плагин для нормлаьной работы с di.
2. сОбытийна модель. ну вот произошло событие загрузки фотки(кстати кто его должен выбросить, фотка сама? или у нас какой то есть сущность для этого другая)? И далььше она обрабатывается всеми штуками. Тут у мнея опыта немного, так тчо не смогу подробно расписать, но идея мне понятна.
3. whole object без событий или то что я называл богатой доменной моделью. Вообще хз что куда пихать? вот дернули метод контроллера загрузить фотку, и дальше что опять нам нужен какой то фотоприемщик, но это насколько я понимаю плохое назваание для сущности(так как отглагольное, и по сути тот же сервис из пункта 1). Но вот допустим приняли мы фотку, и дальше какое ее взаимодествие и с кем? Я не могу понять как бить ответственности между сущностями предметной области, их вообще выделять? Если в анемичной или событийной модели я просто рассматирваю данные(объект фотки) котоырй проходит через разные фильтры/преобразоователи и с которым в итоге что то происходит - могу это ясно изобразить и в коде и на бумаге. Тот тут у меня ступор
ох.... я вечером почитаю


Roman
15.12.2017
10:01:30

Sergey
15.12.2017
10:01:57
каждый агрегат по сути - граница бизнес транзакции

Google

Roman
15.12.2017
10:02:25

Sergey
15.12.2017
10:02:34
проблема в том что ты смешиваешь транзакции в базе и бизнес транзакции. Порой операция подразумевает процесс из нескольких бизнес транзакциц

Roman
15.12.2017
10:03:17

Sergey
15.12.2017
10:03:17
но если у тебя с агрегатом что-то случилось, и это должно быть тригером для другого агрегата, в другом контексте - ивенты тут хорошо подходят
ты можешь ивентами read model формировать - это да
но суть - в изоляции контектов

Enterpise
15.12.2017
10:04:02
Наилучшим решением в данном случае будет «заинлайнить» поля из таблицы Address в таблицу Person:
http://www.pvsm.ru/c-2/109627

Sergey
15.12.2017
10:04:42
короч, доменные ивенты по коммиту транзакции это не зашквар
а так как я не настолько помню как entity framerork работает - то тут ничего не могу подсказать/расскзатьа

Enterpise
15.12.2017
10:05:38


Aleh
15.12.2017
10:05:40
Не микрсоервисы. Если на слабосвязанные бандлы например делить, которые в рамках одного приложения, я думаю тоже это можно назвать сервис ориентирвоанной архитектурой. Ну и сервисы м воспринимаем как "что то делающий деятель", то есть в процессе размышления ставим действия а не данные. Ну и пришел я к SOA vs ES потмоу что ты сказал что без событий не получается грамотный whole object. То есть еще раз, вопросполучается как с whole object создать бизнес транзакцию без событий. Т.е. например получаем фотку от юзера и если там порнуха, то отклоняем ее, заносим полььзователя в бан на месяц, и отсылаем емэй в ментовку например)
1.Анемичная модель:
Сервис фотоприемщик, в которые инджектится фотоМодератор, в который инджектятся сервисФотореагировщик, и уже реализация этого реагирвоика содержит вызов сервисов отправки емайла, бана и т.д. Заметим, если всё делать через DI это будет ее все очень расширемо и легко кастомизируемо за счет полиморфизма в релализации интерфейса разными классами под каждую ситуацию(порно фотка, недостаточный размер фотки, мат на фотке и т.д) Все понятно, хорошо читается и расширяется. Если есть к вашей ide плагин для нормлаьной работы с di.
2. сОбытийна модель. ну вот произошло событие загрузки фотки(кстати кто его должен выбросить, фотка сама? или у нас какой то есть сущность для этого другая)? И далььше она обрабатывается всеми штуками. Тут у мнея опыта немного, так тчо не смогу подробно расписать, но идея мне понятна.
3. whole object без событий или то что я называл богатой доменной моделью. Вообще хз что куда пихать? вот дернули метод контроллера загрузить фотку, и дальше что опять нам нужен какой то фотоприемщик, но это насколько я понимаю плохое назваание для сущности(так как отглагольное, и по сути тот же сервис из пункта 1). Но вот допустим приняли мы фотку, и дальше какое ее взаимодествие и с кем? Я не могу понять как бить ответственности между сущностями предметной области, их вообще выделять? Если в анемичной или событийной модели я просто рассматирваю данные(объект фотки) котоырй проходит через разные фильтры/преобразоователи и с которым в итоге что то происходит - могу это ясно изобразить и в коде и на бумаге. Тот тут у меня ступор
возьми свой первый пункт и вместо сервиса фотоприемщика с одним метод принять фотку запихай этот весь метод в сущность юзера, а все нужные зависимости передай как аргументы

Google

Sergey
15.12.2017
10:05:40
зашквар - доменные ивенты как обычные "события" инфраструктурные или хуки

Aleh
15.12.2017
10:06:15

Roman
15.12.2017
10:06:58
но если у тебя с агрегатом что-то случилось, и это должно быть тригером для другого агрегата, в другом контексте - ивенты тут хорошо подходят
Я думал как сделать - есть команды/запросы и их обработчики (CQRS, не без ES). Прилетает мне команда - я резолвлю обработчик, вызываю его, передавая в него команду. Далее, в ней самой я вызываю доменные сервисы, которые в результате своих действий возвращают эвенты, которые я просто складываю в список. Далее, после успешного коммита транзакции - я пуляю список эвентов в медиатор, который уже будет уведомлять тех, кто эти эвенты ожидает получить.
Что скажешь?

Артур Евгеньевич
15.12.2017
10:09:15
Тут ее вопрос размазывании валидации по слоям? То есть инфраструктурная валидация и бинесс валидация?

Aleh
15.12.2017
10:10:17
и смотри, с чем в итоге связан твой юзер, где нужна новая доменная абстракция, что нужно объединить

Roman
15.12.2017
10:14:02


Maksim (Ellrion)
15.12.2017
10:19:17
Я думал как сделать - есть команды/запросы и их обработчики (CQRS, не без ES). Прилетает мне команда - я резолвлю обработчик, вызываю его, передавая в него команду. Далее, в ней самой я вызываю доменные сервисы, которые в результате своих действий возвращают эвенты, которые я просто складываю в список. Далее, после успешного коммита транзакции - я пуляю список эвентов в медиатор, который уже будет уведомлять тех, кто эти эвенты ожидает получить.
Что скажешь?
так у Сергея вроде нет доменных сервисов, и ты не можешь вызвать в одном месте действия разных сущнойстей (сущностей разного контекста?), так как вызов этих действий у него это реакция на эвент от других сущностей.
а у тебя выходит что эвенты то вообщем и не нужны(не играют роли в построении бизнес процесса). нет?

Roman
15.12.2017
10:21:30


Артур Евгеньевич
15.12.2017
10:31:55
да, передай их просто аргументами в метод
мне не нравится, почему юзер должен знать, что там с его фоткой будут мнипуляции...для него это просто как почтовый ящик должно быть, он кидает фотку и всё - хз что там с ней будет, ибо дойдет либо нет
а тут получается мы пишем письмо, и сам ибегаем с ним по интсаанциям разным, которые его проверяют и модифицируют
и только потом когда все справки полученны кидаем в ящик

Aleh
15.12.2017
10:32:37
если не нравится, что это знает сам юзер, он может быть связан с объектом Photo, который знает только про саму фотку

Артур Евгеньевич
15.12.2017
10:33:17
Потому что ты заходишь в бар например, и ты должен показать пасспорт, то есть раскрыть свою инкапсуляцию чуть чуть.
Так что чтобы тебя контроллирвоать нужно тчо то знать о тебе
а кто должен это делать?
или сервис/контроллер который будет вызывать разные штуки, т.е будет обладать знанием о жиненном цикле фотки, либо , как вчра выяснили собтия

Google

Артур Евгеньевич
15.12.2017
10:35:03
что то мои слова напоминают мне то что я слышал о функциональшине - типо есть данные и хуяришь их по цеопчке йункция

Aleh
15.12.2017
10:35:10
чем же тебе так не нравится идея того, что объекты сами что-то делают, потому что обладают всей информацией для этого
информационный эксперт и вот это вот все

Артур Евгеньевич
15.12.2017
10:36:40
Потому что это противоречит разделению обязнностей. Пользователь не должен заниматсья саомконтроллем и тем более контроллем фотографии
И связанность сильная получается

Aleh
15.12.2017
10:37:24
что такое разделение обязанностей в твоем понимании?
почему пользователь не должен заниматься проверкой собственных инвариантов?

Mykola
15.12.2017
10:39:37

Aleh
15.12.2017
10:39:54
как вариант)
я бы не отказался от объекта, который вместо меня может код писать :3

Mykola
15.12.2017
10:41:14


Артур Евгеньевич
15.12.2017
10:41:33
почему пользователь не должен заниматься проверкой собственных инвариантов?
Не собственных!! Кейс с фоткой, с точки зреня пользооваателя всё ок, он увидел возможность загрузить картинку он берет картинку и грузит. Если он будет проверять по каким то бизнесс правилам(порно не порно/ экстремизм не экстремизм) или инфраструтурным(формат jpeg/gif, минимлаьный размер) то получается чо он лезет кудаа не должен - в првила нашего приложения. И какого хрена он сам себя валидирует, где гранатия что валидция пройдет как надо. Давайте представим что вот пользователь просто грузит фотки, у него оодна обдяанность попытатьс язагрузить фотку - он не мент, не почтальон, не контроллер, он просто нажимает на субмит/кидает фотку в почтовый ящик и т.д. А ты предлагаешь его каким то год обджектом сделать который будет абсоютносамодостаточен и будет иметь доступ к львиной доил бизнесс логики

Mykola
15.12.2017
10:42:20
да это он набросил, не ведись)


Aleh
15.12.2017
10:42:34
Не собственных!! Кейс с фоткой, с точки зреня пользооваателя всё ок, он увидел возможность загрузить картинку он берет картинку и грузит. Если он будет проверять по каким то бизнесс правилам(порно не порно/ экстремизм не экстремизм) или инфраструтурным(формат jpeg/gif, минимлаьный размер) то получается чо он лезет кудаа не должен - в првила нашего приложения. И какого хрена он сам себя валидирует, где гранатия что валидция пройдет как надо. Давайте представим что вот пользователь просто грузит фотки, у него оодна обдяанность попытатьс язагрузить фотку - он не мент, не почтальон, не контроллер, он просто нажимает на субмит/кидает фотку в почтовый ящик и т.д. А ты предлагаешь его каким то год обджектом сделать который будет абсоютносамодостаточен и будет иметь доступ к львиной доил бизнесс логики
вот как раз если логика в объекте пользователя или там в объекте фотки, то у тебя есть гарантия, что валидация пройдет, если же кто угодно в этот объект может запилить что угодно и не вызвать какой-то там сервис, то вот где гарантии уж точно нет)
Не собственных!! Кейс с фоткой, с точки зреня пользооваателя всё ок, он увидел возможность загрузить картинку он берет картинку и грузит. Если он будет проверять по каким то бизнесс правилам(порно не порно/ экстремизм не экстремизм) или инфраструтурным(формат jpeg/gif, минимлаьный размер) то получается чо он лезет кудаа не должен - в првила нашего приложения. И какого хрена он сам себя валидирует, где гранатия что валидция пройдет как надо. Давайте представим что вот пользователь просто грузит фотки, у него оодна обдяанность попытатьс язагрузить фотку - он не мент, не почтальон, не контроллер, он просто нажимает на субмит/кидает фотку в почтовый ящик и т.д. А ты предлагаешь его каким то год обджектом сделать который будет абсоютносамодостаточен и будет иметь доступ к львиной доил бизнесс логики
не к львиной, только к той, к которой он причастен
ну не нравится тебе метод в юзере, сделай объект Photo и занеси это все туда

Google

Артур Евгеньевич
15.12.2017
10:43:48
У меня сайт знакомст, тут пользователь причастен абсолютно ко всем процессам)))

Aleh
15.12.2017
10:43:57
это проблема разделения

Артур Евгеньевич
15.12.2017
10:44:07

Aleh
15.12.2017
10:44:17
вообще User должен быть причастен только к блоку прав и авторизации, по-хорошему

Артур Евгеньевич
15.12.2017
10:45:17
красная это Вернон?

Aleh
15.12.2017
10:45:54
да

Артур Евгеньевич
15.12.2017
11:02:08
Ну хз а допустим юзер грузит фотку а у меня может быть разные варианты с ней - определить в соответствующую категорию в зависимости от того что на ней, может отклонить и добавить юзера, а может вообще описать текстом ее содержимое. + для разных разделов сайта разныеправила модерации. Это что мне сколко классов фотко создавать? Или это все в одном классе, где фотка сама себя анализирует идентефицирует, валидирует и модерирует. Какая то слишком уж самостоятельная сущность и многогранная

Aleh
15.12.2017
11:03:44
а какая альтернатива? 10 разных процедур, которые кто будет вызывать?
проблема анемичной модели в том, что эта глуяющая структура по всему приложению никогда не валидна, ты всегда должен считать ее побитой, потому что кто угодно мог проставить ей какие угодно значения
а так, если у тебя есть куча разных типов фоток, так вырази это в коде

Anton
15.12.2017
12:22:40

Roman
15.12.2017
12:25:19

Like
15.12.2017
12:38:11

Aleh
15.12.2017
14:23:47
https://www.quora.com/Is-Alan-Kay-correct-that-building-software-is-still-like-the-design-and-construction-of-ancient-structures-like-the-Pyramids-in-the-era-before-architecture
там и ссылачка на статью и ответы Кея

Sergey
15.12.2017
21:53:00
Я думал как сделать - есть команды/запросы и их обработчики (CQRS, не без ES). Прилетает мне команда - я резолвлю обработчик, вызываю его, передавая в него команду. Далее, в ней самой я вызываю доменные сервисы, которые в результате своих действий возвращают эвенты, которые я просто складываю в список. Далее, после успешного коммита транзакции - я пуляю список эвентов в медиатор, который уже будет уведомлять тех, кто эти эвенты ожидает получить.
Что скажешь?
доменные сервисы? а сущности там, объекты значения? Да и зачем тебе в таком случае ивенты?


Like
15.12.2017
23:17:49
Такой вопрос: правильно ли я понимаю, что ивенты нужно использовать тогда, когда то, что делает событие выходит за рамки контекста места где вызывается? А обращаться напрямую (заинжектить объект нужного класса и дергнуть метод) только когда все в одном контексте?
Самый простой кейс: отправка имейла с подтверждением регистрации, так как это два разных сервиса (юзеры и сообщения) и они в принципе ничем не свзанны (кроме того, что юзер зависит от этого за счет того, что нужно отправлять сообщение), то здесь должно быть событие.
Ну и в случае, если бы сервис сообщений существовал бы только для юзеров, то можно было бы дергнуть метод.
Так?

Google

Like
15.12.2017
23:19:41
Или дело вкуса?

Mykola
15.12.2017
23:40:08
сами по себе ивенты ничем не отличаются от вызова асинхронной процедуры

Like
15.12.2017
23:40:34
Это понятно

Mykola
16.12.2017
00:04:38
ну а дальше же как и с процедурами, депенденси инвершн и т.д.
ioc

Like
16.12.2017
00:05:18
Ну, вопрос не про это :(

Mykola
16.12.2017
00:05:37
как же не про это?
просто предстявляешь, что вместо ивента ты процедурку вызваешь
и если это нормально - то ивенты тебе подходят
а если нет - то лучше другим способом

Like
16.12.2017
00:07:22
Вот теперь понял, спасибо)

Sergey
16.12.2017
08:24:37

Aleh
16.12.2017
10:05:18
Отличаются только наличием объекта, через который идет "вызов"

Sergey
16.12.2017
10:07:00
мне кажется что термин "вызов" в контексте событий не корректен
отличие как раз таки в том что при "вызове" ты должен знать кого вызывать, а ивенты - наоборот, тебе не интересно кто будет обрабатывать событие и будет ли вообще

Aleh
16.12.2017
10:07:42
Я не знаю другого
Кого именно я вызову - не знаю
С событием я тоже знаю интерфейс