Но мы не предполагаем делать это, потому что, как за команду CQ не должен запрашивать. То есть команда can not зависит от запроса, поскольку запрос может иметь устаревшие записи.
Это не совсем верно.
«Команды» постоянно запускают запросы. Если вы используете источник событий, в большинстве случаев ваши команды : запросов - «если эта команда разрешена, какие события будут сгенерированы?»
Разница между этим и ситуацией, о которой вы описали, представляет собой совокупную границу, которая в случае, если домен, полученный в качестве источника, является причудливым именем для потока событий. Агрегату разрешается запускать запрос против собственного потока событий (то есть его собственного состояния) при обработке команды. Это другие агрегаты (потоки событий), которые находятся за пределами границ.
В практическом плане это означает, что если SpecialResource действительно должны быть транзакционно совместимы с другими идентификаторами ресурсов, то все, что данные должны быть частью той же совокупности, и, следовательно, часть того же потока событий , и все с этого момента довольно прямолинейно.
Итак, если вы моделировали ресурсы с отдельными потоками до этого момента, и теперь вам нужно, чтобы SpecialResource работал так, как вы описали, то у вас есть довольно значительное изменение для вашей модели домена.
Хорошая новость: это, вероятно, не ваше настоящее требование. Подумайте, что вы описали до сих пор - если resourceId: 99652 создается за миллисекунду до SpecialResource, тогда он должен быть включен в состояние SpecialResource, но если он создается через миллисекунду после, то это не должно. Итак, . Какова стоимость для бизнеса, если ресурс создан за миллисекунду до того, как пропущен SpecialResource?
Потому что, априори, это не похоже на что-то, что должно быть слишком дорого.
Как правило, реальное требование выглядит чем-то более похожим: «SpecialResource должен включать все идентификаторы ресурсов, созданные до закрытия бизнеса», но вам фактически не нужен SpecialResource до 5 минут после закрытия бизнеса. Другими словами, у вас есть SLA здесь, и вы можете использовать этот SLA, чтобы лучше сообщить свою команду.
Как мы можем достичь этого бизнес-сценария без запроса существующих записей в приложении?
Включите его; запустите запрос, скопируйте результаты запроса (идентификаторы ресурсов) в команду, которая создает SpecialResource, затем отправьте команду, которая будет передана вашей модели домена. Команда CreateSpecialResource включает в себя правильный список идентификаторов ресурсов, поэтому агрегировать не нужно беспокоиться о том, как обнаружить эту информацию.
Вам действительно нужно материализовать список существующих ресурсов? Не может ли это предоставить база данных? (Кроме того, я не понимаю, зачем связывать «со всеми существующими ресурсами в приложении» - может быть, с выбором существующих ресурсов?) –
В базе данных есть все ресурсы. Вы имеете в виду, что мы должны связывать все эти ресурсы в базе данных, а не в домене. Если мы это сделаем, укажите (в stateStore) SpecialResource не будут иметь идентификаторы ресурсов –
Пожалуйста, уточните, что вы подразумеваете под «всеми существующими ресурсами в приложении». Является ли этот особый объект действительно каталогом? Если это так, почему бы не делегировать его базе данных и эффективно вычислять каждый раз в запросах? –