У меня есть следующая задача:CQRS и команда дребезг
- Наша текущая архитектура Web SPA с CQRS и MVVM. У нас есть команды , запросы и SingnalR как шина сообщений.
- Пользователи могут выбирать, перемещать, изменять размеры divs на одной рабочей области из нескольких веб-браузеров одновременно.
- Каждый div привязан к соответствующей ViewModel. Каждый ViewModel имеет собственный запрос для обновления. Каждый ViewModel подписался на бизнес-события и обновил все состояние после него.
Позволяет изображение, которое пользователь выполняет следующие действия:
- Выберите Див (SelectWidgetCommand посланный)
- Перемещение дел до х = 10. (ChangePositionCommand отправлено)
- Переместить div на x = 100. (ChangePositionCommand пересылаются)
Проблема заключается в том, что команды являются пожаро- и забыть, и пользователь может получить событие WidgetSelectedEvent во время шага 3, но ChangePositionCommand не могут быть обработаны еще. Таким образом, пользователь получит старую позицию x, и div переместится в прежнее положение.
Какова наилучшая практика для решения таких проблем?
Что мы сейчас делаем, так это разделение DivViewModel на два div: SelectionViewModel, PositionViewModel. Каждый ViewModel имеет собственный запрос для обновления и различные события для обработки. Также мы рассматриваем использование буфера debounce и roll для обработки команд.
Ваше решение кажется хорошим. Разделите на более мелкие модели, каждый из которых синхронизируется через определенное подмножество событий. Другим решением, которое я мог бы подумать, было бы иметь одну модель, но создавать сопоставления атрибутов событий (например, map ViewModel.position to ChangePositionCommand.position). До тех пор, пока ваши события не будут получены из строя, которые должны работать. Кстати, странно, что команда selecton обрабатывается на стороне сервера. Не может ли состояние выбора существовать только на клиенте? – plalx
@plalx У нас есть тот же выбор для всех пользователей, которые работают в одной рабочей области –
Разве это не создает ненужного спора, который почти предотвращает сотрудничество? Что делать, если выбор будет изменен пользователем B, в то время как пользователь A пытался выполнить команду по его первоначальному выбору? – plalx