Самое простое решение - спроецировать текущее состояние вместе с доступными переходами на модель чтения / запроса и выбрать его вместе с данными для отображения.
Пример:
PlaceOnHoldCommand
приводит к OrderPlacedOnHoldEvent
, который (помимо помещения в EventStore ) публикуется и обрабатывается OrderTransitionsEventHandler
, который денормализует доступные переходы в таблицу БД, связанную с Order. Клиент выбирает доступные переходы и действует соответственно (скрывает недоступные кнопки или что-то в этом роде).
Это, конечно, один из вариантов. Не ожидайте, однако, что не будет никакого дублирования вообще. CQRS помогает управлять сложностью, а иногда это означает, что происходят незначительные нарушения DRY.