|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthatlove_bachесли я правильно понял, тут про какой-то фоновый сервис хвост имел в виду. у меня такого нет Можно в пределах одного процесса - ничего не мешает. Отправитель - в одном потоке, обработчик - в другом. Делаешь абстракцию (интерфейс) типа ICommandBus, все команды пускаешь через неё. Если потом захочется переехать на микросервисы/распределенку, то проблем никаких - делаешь просто другую реализацию ICommandBus (через RabbitMQ, или Azure Queue Storage, например) и все - мягко, гладко и безболезненно переезжаешь. Можно при этом даже запросто распараллелить обработку команд сразу на несколько узлов. оу, астанавись! я не про это сейчас - а тупо про возврат из команды ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:42 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachя не про это сейчас - а тупо про возврат из команды Принцип "дернул и забыл" без возврата результата дает больше возможности для последующей модификации архитектуры. Если ты сделаешь с возвратом результата, то ты уже будешь навеки привязан к "дернул и ждем". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:48 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthatlove_bachя не про это сейчас - а тупо про возврат из команды Принцип "дернул и забыл" без возврата результата дает больше возможности для последующей модификации архитектуры. Если ты сделаешь с возвратом результата, то ты уже будешь навеки привязан к "дернул и ждем". ок, это аргумент, если есть такое требование а если нет такого требования? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 17:55 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachа если нет такого требования? А если нет такого требования, а потом будет? :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 18:08 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthatlove_bachа если нет такого требования? А если нет такого требования, а потом будет? :)) хз PS ушел в печале думать над архитектурой ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 18:18 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachушел в печале думать над архитектурой Если ты не победитель шоу "битва экстрасенсов", то забей и не пытайся предъугодать будущее. Ты предусмотришь любые изменения вдоль и поперек, а оно изменится по диагонали. Пройдено неоднократно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 21:13 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Dima T, Ну, какбэ, хорошая архитектура, паттерны, SOLID и т.п. это таки совсем не только чтобы "предугадать будущее". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 21:35 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachне по теме сабжа вопрос: 1. а почему плохо? можешь пример привести? 2. "так как команда может выполнится асинхронно" - await? 1. потому что команда может быть выполнена отложено, и результат будет позже. на начальном и даже среднем этапе разработки это не так очевидно, вылазит гораздо позже. 2. async в данном случае это для взаимодействия с асинхронными интерфейсами (апи, бд, файловая система, и т.п.), но на то то и команда, что может встать в очередь выполнения, или это может быть тяжёлая операция, которую не стоит ожидать. в случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2019, 23:44 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttlove_bachне по теме сабжа вопрос: 1. а почему плохо? можешь пример привести? 2. "так как команда может выполнится асинхронно" - await? 1. потому что команда может быть выполнена отложено, и результат будет позже. на начальном и даже среднем этапе разработки это не так очевидно, вылазит гораздо позже. 2. async в данном случае это для взаимодействия с асинхронными интерфейсами (апи, бд, файловая система, и т.п.), но на то то и команда, что может встать в очередь выполнения, или это может быть тяжёлая операция, которую не стоит ожидать. в случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс. я так понял, что это все в "асинхронное взаимодействие" мотивировано. а если его нет, то вдруг оно появится ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2019, 16:23 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttв случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс. Ну, можно ведь просто два интерфейса сделать. ICommandHandler<TCommand, TResult> и ICommandHandler<TCommand> - такое сплошь и рядом. Для Task тоже два типа определены. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2019, 17:18 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachя так понял, что это все в "асинхронное взаимодействие" мотивировано. а если его нет, то вдруг оно появится Нет, мотивировано не этим, это просто один из вариантов развития. Команда это не функция -- вот основное отличие. Наличие возможности возвращать результат неизбежно приводит к тому, что команды начинают применять, как функции, что вредит архитектурному принципу. Например, в команду переносят валидацию, проверки, хотя они должны быть выполнены до запуска команды. Или вычисление результата, команда не вычисляет результат, она вносит изменения в систему. Если приводить аналогию с SQL, то это как INSERT/UPDATE/DELETE -- каких вы результатов ожидаете? Единственное противоречие, которое не бьётся с командой, это идентификатор, который вычисляется на стороне БД при вставке записи в таблицу. Как решается, я писал выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2019, 00:07 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttв случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс. Ну, можно ведь просто два интерфейса сделать. ICommandHandler<TCommand, TResult> и ICommandHandler<TCommand> - такое сплошь и рядом. Для Task тоже два типа определены. Этого не достаточно. Придётся сделать 2 метода у ICommandBus Придётся сделать 2 интерфейса для самой команды. Всё станет сложнее минимум в 2 раза. На самом деле более, чем в 2 раза. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2019, 00:08 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVostt Код: c# 1. 2. 3. 4. 5.
Вот такого интерфейса достаточно, не нужно городить TResult, команда не должна ничего возвращать. Если нужно получать данные (например, идентификатор созданной сущности), то это делается двумя путями: 1. хороший: через отдельное событие, на которое клиент подписывается, так как команда может выполнится асинхронно 2. средненькой паршивости: записывать данные прям в объект переданной команды. но что-то там возвращать -- совсем плохо. отбросим асинхронность, меня пока это не интересует: 1. если через событие, то после вызова команды в контроллере надо сделать запрос? иначе где там ловить событие в методе, где нужно возвращаемое значение 2. "средненькую паршивость" можно как-то явно обозначить (префиксы Out к свойствам команды, ...)? или это получится "совсем плохо"? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2019, 17:48 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
события у меня и так были, но не для "возврата из команды", а как "доменные события". как с ними связать что предложил хвост, не догнал. сделал "средненькую паршивость" - какое-то интуитивное сомнение закралось, что плохо возвращать из команд return-ом. может я просто сильно ведусь ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:42 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bach, что именно из команд вы хотите возвращать? айдишник созданной записи? что ещё? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:51 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bach, если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:52 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttчто именно из команд вы хотите возвращать? айдишник созданной записи? что ещё? Мы когда-то пришли к идее использовать пару айдишек - один автоинкрементный для БД, второй "внешний" guid, который генерится сразу в приложении еще до вставки записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 17:57 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
fkthathVosttчто именно из команд вы хотите возвращать? айдишник созданной записи? что ещё? Мы когда-то пришли к идее использовать пару айдишек - один автоинкрементный для БД, второй "внешний" guid, который генерится сразу в приложении еще до вставки записи. тогда можно было и отказаться от автоинкремента и просто сделать свой гуид примари ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:03 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttlove_bach, что именно из команд вы хотите возвращать? айдишник созданной записи? что ещё? не, ид-шник гуид, нет необходимости. честно говоря, то что ты написал, я переосмыслил. возвращать - нечего. там реально по смыслу приложения надо было делать после команды запрос. к тому же, там и так был такой запрос. в целом хвост - спасибо просто интересно - если бы ну вот сильно сильно надо было , то как? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:29 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttlove_bach, если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :) да, команда преобразовывает - нормализует номер мобилы и пр. данные. и возвращала (сейчас "по паршивенькому варианту") она структуру с этим номером и пр. данные, нормализованными. внутри себя она использовала сервисы нормлизации ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:35 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachhVosttlove_bach, если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :) да, команда преобразовывает - нормализует номер мобилы и пр. данные. и возвращала (сейчас "по паршивенькому варианту") она структуру с этим номером и пр. данные, нормализованными. внутри себя она использовала сервисы нормлизации вынести эту нормализацию из команды? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:40 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
love_bachlove_bachпропущено... да, команда преобразовывает - нормализует номер мобилы и пр. данные. и возвращала (сейчас "по паршивенькому варианту") она структуру с этим номером и пр. данные, нормализованными. внутри себя она использовала сервисы нормлизации вынести эту нормализацию из команды? точно! бл*, она еще и в валидаторах, типа если могу - нормализирую. придется и это еще исправить ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:47 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
hVosttтогда можно было и отказаться от автоинкремента и просто сделать свой гуид примари Гуид примари для кластерного индекса это не очень хорошо, потому что он не sequential и это сильно тормозит вставку. Тут разве что если генерить последовательные гуиды (в сиквеле есть готовая ф-ия, на клиенте немного сложнее, но вполне решаемо). Но, собственно, пара айдишек на деле совсем не напрягает, тем более у нас эти "внешние" guid-ы почти везде используются только для корней агрегатов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 18:53 |
|
Маркерный интерфейс
|
|||
---|---|---|---|
#18+
Если на клиенте генерировать последовательные гуиды, тогда можно с тем же успехом генерить последовательные инты )) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2019, 19:45 |
|
|
start [/forum/topic.php?fid=20&msg=39878460&tid=1398741]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
132ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 255ms |
total: | 495ms |
0 / 0 |