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