Согласно Фаулеру (здесь), репозиторий "опосредует между слоями отображения домена и данных, действуя как коллекция объектов домена в памяти". Так, например, в приложении "Курьерская служба" при отправке нового прогона служба моего приложения создает новый объект "Заполнить агрегатный корень", заполняет его значениями из запроса и добавляет их в RunRepository, прежде чем вызывать Группу работы для сохранения изменения в базе данных. Когда пользователь хочет просмотреть список текущих прогонов, я запрашиваю один и тот же репозиторий и возвращаю денормализованный DTO, представляющий информацию.
Однако при просмотре CQRS запрос не попадет в один и тот же репозиторий. Вместо этого он, возможно, будет непосредственно направлен против хранилища данных и всегда будет денормализован. И моя команда будет развиваться в NewRunCommand и Handler, которые будут создавать и заполнять объект домена NewRun, а затем сохраняют информацию в хранилище данных.
Итак, первый вопрос: где репозитории вписываются в модель CQRS, если мы не поддерживаем сборку в памяти (кэш, если хотите) объектов домена?
Рассмотрим случай, когда информация, представленная моей службе приложений, содержит только ряд значений идентификатора, которые служба должна разрешить для создания объекта домена. Например, запрос содержит идентификатор # курьера, назначенного для запуска. Служба должна искать фактический объект Courier на основе значения ID и назначать объект NewRun с использованием метода AssignCourier (который проверяет курьер и выполняет другую бизнес-логику).
Другой вопрос заключается в том, что, учитывая разделение запросов и потенциальное отсутствие репозиториев, как служба приложений выполняет поиск, чтобы найти объект домена Courier?
UPDATE
Основываясь на некоторых дополнительных чтениях и размышлениях после комментария Денниса, я буду перефразировать мои вопросы.
Мне кажется, что CQRS поощряет репозитории, которые являются просто фасадами над механизмами доступа к данным и хранения данных. Они дают "внешний вид" коллекции (как описывает Фаулер), но не управляют сущностями в памяти (как указал Деннис). Это означает, что каждая операция в репозитории является сквозной, да?
Каким образом подразделение труда вписывается в этот подход? Как правило, UoW используется для фиксации изменений, внесенных в репозиторий (правильно?), Но если репозиторий не поддерживает сущности в памяти, то какая роль имеет UoW?
Что касается операции "write", может ли обработчик команды ссылаться на тот же репозиторий, другой репозиторий или, возможно, UoW вместо репозитория?