powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Маркерный интерфейс
25 сообщений из 56, страница 2 из 3
Маркерный интерфейс
    #39878439
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatlove_bachесли я правильно понял, тут про какой-то фоновый сервис хвост имел в виду. у меня такого нет
Можно в пределах одного процесса - ничего не мешает. Отправитель - в одном потоке, обработчик - в другом. Делаешь абстракцию (интерфейс) типа ICommandBus, все команды пускаешь через неё. Если потом захочется переехать на микросервисы/распределенку, то проблем никаких - делаешь просто другую реализацию ICommandBus (через RabbitMQ, или Azure Queue Storage, например) и все - мягко, гладко и безболезненно переезжаешь. Можно при этом даже запросто распараллелить обработку команд сразу на несколько узлов.

оу, астанавись!
я не про это сейчас - а тупо про возврат из команды
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878442
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachя не про это сейчас - а тупо про возврат из команды
Принцип "дернул и забыл" без возврата результата дает больше возможности для последующей модификации архитектуры. Если ты сделаешь с возвратом результата, то ты уже будешь навеки привязан к "дернул и ждем".
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878447
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatlove_bachя не про это сейчас - а тупо про возврат из команды
Принцип "дернул и забыл" без возврата результата дает больше возможности для последующей модификации архитектуры. Если ты сделаешь с возвратом результата, то ты уже будешь навеки привязан к "дернул и ждем".

ок, это аргумент, если есть такое требование
а если нет такого требования?
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878460
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachа если нет такого требования?
А если нет такого требования, а потом будет? :))
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878468
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatlove_bachа если нет такого требования?
А если нет такого требования, а потом будет? :))

хз

PS
ушел в печале думать над архитектурой
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878528
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachушел в печале думать над архитектурой
Если ты не победитель шоу "битва экстрасенсов", то забей и не пытайся предъугодать будущее. Ты предусмотришь любые изменения вдоль и поперек, а оно изменится по диагонали. Пройдено неоднократно.
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878538
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Ну, какбэ, хорошая архитектура, паттерны, SOLID и т.п. это таки совсем не только чтобы "предугадать будущее".
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878575
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachне по теме сабжа вопрос:
1. а почему плохо? можешь пример привести?
2. "так как команда может выполнится асинхронно" - await?

1. потому что команда может быть выполнена отложено, и результат будет позже. на начальном и даже среднем этапе разработки это не так очевидно, вылазит гораздо позже.

2. async в данном случае это для взаимодействия с асинхронными интерфейсами (апи, бд, файловая система, и т.п.), но на то то и команда, что может встать в очередь выполнения, или это может быть тяжёлая операция, которую не стоит ожидать.

в случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс.
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878647
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttlove_bachне по теме сабжа вопрос:
1. а почему плохо? можешь пример привести?
2. "так как команда может выполнится асинхронно" - await?

1. потому что команда может быть выполнена отложено, и результат будет позже. на начальном и даже среднем этапе разработки это не так очевидно, вылазит гораздо позже.

2. async в данном случае это для взаимодействия с асинхронными интерфейсами (апи, бд, файловая система, и т.п.), но на то то и команда, что может встать в очередь выполнения, или это может быть тяжёлая операция, которую не стоит ожидать.

в случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс.

я так понял, что это все в "асинхронное взаимодействие" мотивировано. а если его нет, то вдруг оно появится
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878656
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttв случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс.
Ну, можно ведь просто два интерфейса сделать. ICommandHandler<TCommand, TResult> и ICommandHandler<TCommand> - такое сплошь и рядом. Для Task тоже два типа определены.
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878750
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachя так понял, что это все в "асинхронное взаимодействие" мотивировано. а если его нет, то вдруг оно появится

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

Например, в команду переносят валидацию, проверки, хотя они должны быть выполнены до запуска команды.
Или вычисление результата, команда не вычисляет результат, она вносит изменения в систему.

Если приводить аналогию с SQL, то это как INSERT/UPDATE/DELETE -- каких вы результатов ожидаете?
Единственное противоречие, которое не бьётся с командой, это идентификатор, который вычисляется на стороне БД при вставке записи в таблицу.

Как решается, я писал выше.
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39878751
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVosttв случае обязательного типа ответа, придётся городить костыли, что-то типа "пустое значение", так как void нельзя указывать в качестве типа. и на лицо кривой интерфейс.
Ну, можно ведь просто два интерфейса сделать. ICommandHandler<TCommand, TResult> и ICommandHandler<TCommand> - такое сплошь и рядом. Для Task тоже два типа определены.

Этого не достаточно.
Придётся сделать 2 метода у ICommandBus
Придётся сделать 2 интерфейса для самой команды.

Всё станет сложнее минимум в 2 раза. На самом деле более, чем в 2 раза.
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39882861
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
2.
3.
4.
5.
public interface ICommandHandler<TCommand>
    where TCommand: CommandBase
{
   Task HandleAsync<TCommand>(TCommand command, CancellationToken ct);
}




Вот такого интерфейса достаточно, не нужно городить TResult, команда не должна ничего возвращать. Если нужно получать данные (например, идентификатор созданной сущности), то это делается двумя путями:

1. хороший: через отдельное событие, на которое клиент подписывается, так как команда может выполнится асинхронно
2. средненькой паршивости: записывать данные прям в объект переданной команды.

но что-то там возвращать -- совсем плохо.

отбросим асинхронность, меня пока это не интересует:
1. если через событие, то после вызова команды в контроллере надо сделать запрос? иначе где там ловить событие в методе, где нужно возвращаемое значение
2. "средненькую паршивость" можно как-то явно обозначить (префиксы Out к свойствам команды, ...)? или это получится "совсем плохо"?
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883231
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
события у меня и так были, но не для "возврата из команды", а как "доменные события". как с ними связать что предложил хвост, не догнал. сделал "средненькую паршивость" - какое-то интуитивное сомнение закралось, что плохо возвращать из команд return-ом. может я просто сильно ведусь
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883235
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach,

что именно из команд вы хотите возвращать?
айдишник созданной записи? что ещё?
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883242
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach,

если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :)
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883244
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttчто именно из команд вы хотите возвращать?
айдишник созданной записи? что ещё?
Мы когда-то пришли к идее использовать пару айдишек - один автоинкрементный для БД, второй "внешний" guid, который генерится сразу в приложении еще до вставки записи.
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883251
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVosttчто именно из команд вы хотите возвращать?
айдишник созданной записи? что ещё?
Мы когда-то пришли к идее использовать пару айдишек - один автоинкрементный для БД, второй "внешний" guid, который генерится сразу в приложении еще до вставки записи.

тогда можно было и отказаться от автоинкремента и просто сделать свой гуид примари
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883270
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttlove_bach,

что именно из команд вы хотите возвращать?
айдишник созданной записи? что ещё?

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

в целом хвост - спасибо

просто интересно - если бы ну вот сильно сильно надо было , то как?
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883274
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttlove_bach,

если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :)

да, команда преобразовывает - нормализует номер мобилы и пр. данные. и возвращала (сейчас "по паршивенькому варианту") она структуру с этим номером и пр. данные, нормализованными. внутри себя она использовала сервисы нормлизации
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883276
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachhVosttlove_bach,

если команда у вас что-то достаёт/вычисляет/преобразовывает и вы хотите это куда-то передать/отобразить, то вы неправильно используете концепцию команд и неизбежно наполучаете граблями по лбу и по заднему место, больно :)

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

вынести эту нормализацию из команды?
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883278
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachlove_bachпропущено...


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

вынести эту нормализацию из команды?

точно!
бл*, она еще и в валидаторах, типа если могу - нормализирую.
придется и это еще исправить
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883281
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttтогда можно было и отказаться от автоинкремента и просто сделать свой гуид примари
Гуид примари для кластерного индекса это не очень хорошо, потому что он не sequential и это сильно тормозит вставку. Тут разве что если генерить последовательные гуиды (в сиквеле есть готовая ф-ия, на клиенте немного сложнее, но вполне решаемо). Но, собственно, пара айдишек на деле совсем не напрягает, тем более у нас эти "внешние" guid-ы почти везде используются только для корней агрегатов.
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883306
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если на клиенте генерировать последовательные гуиды, тогда можно с тем же успехом генерить последовательные инты ))
...
Рейтинг: 0 / 0
Маркерный интерфейс
    #39883317
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЕсли на клиенте генерировать последовательные гуиды, тогда можно с тем же успехом генерить последовательные инты ))

он имел ввиду не глабальные, наверное, а для этого места
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Маркерный интерфейс
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]