У меня есть два вопроса, связанных с CQRS и доменно-управляемым дизайном (DDD).
Насколько я понимаю идею сегрегации, стоящую за CQRS, у каждого было бы две отдельные модели: модель чтения и запись модель. Только модель записи будет иметь доступ к модели бизнес-домена и использовать ее с помощью команд. Однако модель чтения напрямую переводит содержимое базы данных в DTO с помощью запросов и вообще не имеет доступа к бизнес-домену.
Для контекста: я пишу серверную часть веб-приложения, предоставляющую услуги для расчета физика частиц. Теперь мои вопросы:
1.) Логика моего бизнес-домена c содержит некоторые функции, которые вычисляют математические значения как выходные данные из заданных конфигураций измерительной системы в качестве входных данных. Таким образом, технически это запросы только для чтения, которые вычисляют значения на лету и не изменяют состояние в любой модели. Таким образом, они должны быть частью модели чтения. Однако, поскольку функции тесно связаны с доменом, они должны быть частью модели предметной области, которая снова является частью модели записи. Как мне сделать эти функции вычисления доступными для внешнего интерфейса через мой API, если модель чтения, которая должна содержать все запросы, не имеет доступа к модели домена?
Действительно ли мне нужно запускать команда для сохранения всех вычислений в базе данных, чтобы модель чтения могла получить доступ к результатам вычислений? Эти «одноразовые» вычисления будут использоваться только внешним интерфейсом, и в дальнейшем никто не будет иметь доступа к постоянным результатам расчетов. Постоянной должна быть конфигурация измерений, а не результаты расчетов. Они будут пересчитываться много раз, когда пользователь нажимает кнопку «Рассчитать» на внешнем интерфейсе.
2.) Мне также кажется, что я дублирую довольно много кода проверки данных, потому что оба читают модель и модель записи должны десериализовать и проверять одинаковые или очень похожие параметры запроса в цепочке процессов http request body -> json -> unvalidated DTO -> validated value -> command/query.
Как с этим бороться? Могу ли я поделиться кодом проверки между моделью чтения и моделью записи? Кажется, это растворяет сегрегацию.
Заранее благодарим за помощь и идеи.